Redis 5.0 重量级特性 Stream 实现源码分析(二)XREAD 消费流程
Redis 5.0 重量级特性 Stream 实现源码分析(一)overview,XADD
kafka在日志处理领域由于其一系列的工具,其他相关服务,基本上算得上是王者,但是缺点也很明显: 难以维护,性能低,需要大量机器,部署复杂,参数众多。
前阵子Redis 5.0 Beta版本发布 , 随之而来的重大特性“Introduction to Redis Streams”, 似乎跟kafka在功能上有很多类似的地方,但也有不少不一样的点。
阅读全文...
geth以太坊源码分析-P2P模块基于UDP的服务发现机制原理(2)
上篇文章分析到了p2p模块是怎么通过UDP协议去测试其他节点的连通性的(geth以太坊源码分析-P2P模块基于UDP的服务发现机制原理(1))。接下来分析一下是怎么发现其他邻近节点的。
节点发现主要是findnode, neighbors消息的处理。
阅读全文...
geth以太坊源码分析-P2P服务发现 UDP协议存在死循环没有优雅退出
geth代码时, 到p2p/discover/udp.go readLoop()函数的处理的时候,直接一个死循环没有监听closing管道,所以基本上是不能优雅退出的。
可能是作者觉得这个不重要,所以没管它?
nsqd 源码分析(1)- 启动服务
前段时间了解Go语言,开始了解Go的优秀开源服务,所以找出NSQ学习一下,下载了一份nsq源码开始学习,顺便记录一下阅读的笔记。
对协程实现原理感兴趣的话推荐看一看libtask,几年前在看源码的时候写过2篇笔记,里面有代码和注释:libtask协程库实现源码学习
NSQ是一个实时分布式消息处理服务,支持分布式,其源码包括:
1. nsqd 作为一个主要的消息接受,发送, 跟客户端沟通的后台进程,负责监听客户端连接,处理客户端的发送接收请求;
2. nsqlookupd 是一个管理进程,其他所有nsqd启动会尝试不断连接他,上报topic信息等;
3. nsqadmin 管理进程;
4. 其他便利工具;
让人爱恨交加的Redis Scan遍历操作原理
还记得,深夜,你在Redis 命令行里敲入"keys *" 后,线上开始报警,然后只能举起双手焦急的等待几千万key被慢慢扫描几十分钟还没结果,束手无策的时候,你跟所有redis用户拥有同样的心声:“就不能温柔点让我遍历一遍所有的数据吗?”
要知道,遍历一下数据库里面的所有数据,是多么理所应当的要求,这在mysql等关系型数据库眼里是多么的不可理解的。
修改libtask支持epoll处理大量并发连接
原生的libtask库不支持epoll, 这样无法处理大量并发协程的情况,所以小改了下,让它支持epoll,允许大量并发协程运行。代码在这里libtask_epoll。
修改方法比较简单,就是把epoll_create, epoll_ctl, epoll_wait 几个函数的使用替换掉原来poll相关的函数,diff在这里。 阅读全文...
memcached里面一段神奇,危险,暂且无bug的code: add_iov
翻memcached代码,看到一个函数:add_iov , 在里面着实纳闷了许久,多次认为这个代码会有问题,于是打日志,gdb上去调试,最后不得不承认: 这代码能work!(不过很危险)
memcached源码学习-线程框架
看了看memcached, memcached 主要的线程框架是master-slave的主线程-工作线程模式,单进程,多线程,之间通过管道和链表通信,基本就是这样。
下面具体看下代码。 阅读全文...
libtask协程库实现源码学习-异步I/O
上篇文章写了libtask协程库实现的基本原理,最后说道协程编程一个很大的关键点是,程序员需要知道什么时候应该进行协程切换,什么地方需要异步I/O,什么地方的代码是顺序运行的等。
这里回顾一下具体哪些地方需要做协程切换,异步I/O: 所有可能会造成阻塞的操作,都必须进行异步IO处理,及时切换协程,绝对不能在协程里面做阻塞操作,因为阻塞了大家都阻塞了,就黄了。
顺藤摸瓜,上次的http压力测试小程序里面,协程执行函数fetchtask就是协程运行的主要函数,看下其实现: 阅读全文...
libtask协程库实现源码学习
协程的概念不多说了,轻量级线程,其最大的优势就是协程之间的切换代价非常低,理论上是单线程运行,只是在应用层进行了上下文手动切换。
其最重要的实现函数是makecontext, getcontext, swapcontext 这一组函数,具体的协程上下文切换由他们完成。具体就不多说了,这些函数在glibc里面是已汇编的形式提供的,实际上做的工作就是讲各个寄存器,堆栈指针,指令指针等全部保存起来,或者进行切换,从而达到协程切换的目的。我们知道程序在CPU上运行的时候,注意依赖2个重要的东西: 阅读全文...
Redis Scan迭代器遍历操作原理(二)–dictScan反向二进制迭代器
续上一篇文章 Redis Scan迭代器遍历操作原理(一)--基础 ,这里着重讲一下dictScan函数的原理,其实也就是redis SCAN操作最有价值(也是最难懂的部分)。
关于这个算法的源头,来自于githup这里:Add SCAN command #579,长篇的讨论,确实难懂····建议看看这帖子,antirez 跟pietern 关于这个奇怪算法的讨论···
这个算法的作者是:Pieter Noordhuis,作者称其为:reverse binary iteration ,不知道我一对一翻译为“反向二进制迭代器”可不可以,不过any way ··作者自己也没有明确的证明其真假: 阅读全文...
Redis Scan迭代器遍历操作原理(一)–基础
Redis在2.8.0版本新增了众望所归的scan操作,从此再也不用担心敲入了keys*, 然后举起双手看着键盘等待漫长的系统卡死了···
命令的官方介绍在这里, 中文版由huangz同学细心翻译了,作者Antirez的介绍在这里:Finally Redis collections are iterable (我又邪恶的想到了之前他那次机器down机的事故了···)。
具体的使用参考上面的链接即可,这里大概介绍一下Scan操作的实现原理。 阅读全文...
一次由于sbrk()无法压缩导致内存RSS虚高造成“内存泄露”的假象
最近写的一个C网络服务器程序在高压力后top进程看内存的RSS总是等于最高值, 以为是内存泄露,到处查看代码没问题,用valgrind跟了一下也还是没有发现问题。
于是将malloc改为自己的函数记录了一下程序的malloc, free操作,从而算出还有多少大小内存没有释放,最后结果是一切正常,基本都释放了,但奇怪的是RSS却没有降下来。 阅读全文...
librtmp实时消息传输协议(RTMP)库代码浅析
没事碰到了librtmp库,这个库是ffmpeg的依赖库,用来接收,发布RTMP协议格式的数据。
代码在这里:git clone git://git.ffmpeg.org/rtmpdump
先看一段通过librtmp.so库下载RTMP源发布的数据的例子,从rtmpdump中抽取出来。使用的大体流程如下:
- RTMP_Init主要就初始化了一下RTMP*rtmp变量的成员。
- RTMP_SetupURL 函数将rtmp源地址的端口,app,等url参数进行解析,设置到rtmp变量中。比如这样的地址: rtmp://host[:port]/path swfUrl=url tcUrl=url 。
- RTMP_SetBufferMS 函数设置一下缓冲大小;
- RTMP_Connect函数完成了连接的建立,一级RTMP协议层的应用握手,待会介绍。
- RTMP_ConnectStream总的来说,完成了一个流的创建,以及打开,触发服务端发送数据过来,返回后,服务端应该就开始发送数据了。
- Download 其实是RTMP_Read函数的封装,后者读取服务端的数据返回。
近期评论