SecureCRT 断网或重启后支持自动打开之前的会话上下文

2018年11月5日 评论 565次阅读    

最近工作原因,电脑必须设置几分钟后自动锁屏睡眠,于是每次建立的一堆crt的tab都得重新连接,包括之前正打开的vim等会话,于是上下文全没了。
琢磨了一下可以利用CRT的自动执行脚本功能,写一个小python发命令过去就可以了。每次使用screen打开会话,这样就能保留上下文。

阅读全文...

分类: 生活杂感 标签:

关于带团队的一些感悟

2018年8月7日 3 条评论 716次阅读    

最近几年慢慢挪一些精力到团队上面,其实这方面觉得摸着石头过河,然后自己呛了一口水,也很多事情没做好,挺对不住兄弟们的。

其实非常不想提‘管理’这两个字,因为我理解谈不上谁管谁,而是大家一起努力,一起干,只是工作分工不同,有些人不得不抽时间去做一些support工作,有些人喜欢专门投入精力到coding, profiling中去而已。所以百度技术人才有T序列,和M序列的拆分。

阅读全文...

分类: 生活杂感 标签:

Redis 5.0 Stream消息队列会每次唤醒所有同一个group内的消费者

2018年8月5日 评论 5307次阅读    

Redis stream支持多个消费者在同一个group里面消费,并且一条消息只会发送给一个消费者,不会被同组内的多个consumer获取。但有些特殊情况也不得不注意。

阅读全文...

分类: Redis 标签: , ,

Redis 5.0 重量级特性 Stream 实现源码分析(二)XREAD 消费流程

2018年8月5日 评论 5269次阅读    

上面的文章整体介绍了stream 实现方式,以及xadd生产端的流程,接下来继续写一下后面消费端的过程。
redis stream的消费方法有几种, XREAD、XREADGROUP, 还有xrange/xrevrange, 后者比较简单,主要就是准备参数然后调用streamReplyWithRange 来根据范围读取消息内容。
阅读全文...

分类: C/C++, Redis 标签: , ,

Redis 5.0 重量级特性 Stream 实现源码分析(一)overview,XADD

2018年8月5日 2 条评论 5494次阅读    

kafka在日志处理领域由于其一系列的工具,其他相关服务,基本上算得上是王者,但是缺点也很明显: 难以维护,性能低,需要大量机器,部署复杂,参数众多。
前阵子Redis 5.0 Beta版本发布 , 随之而来的重大特性“Introduction to Redis Streams”, 似乎跟kafka在功能上有很多类似的地方,但也有不少不一样的点。
阅读全文...

分类: C/C++, Redis 标签: , ,

geth以太坊源码分析-连接其他以太坊peer节点流程

2018年7月15日 2 条评论 7193次阅读    

之前的文章讲过P2P模块的UDP节点发现机制以及TCP连接池机制,接下来讲一下连接池后面,连接到一个新的节点后,接下来的流程是什么样的,怎么开始的区块同步,交易同步等。
阅读全文...

分类: geth 标签: , ,

geth以太坊源码分析-P2P模块TCP连接池网络通信机制原理

2018年7月1日 1 条评论 7075次阅读    

geth的P2P模块有2个重要的部分:基于UDP的节点发现模块 以及 TCP数据传输连接池模块。
之前讲过节点发现部分,用来根据设置的少了BootstrapNodes节点来发现更多全网的其他节点,这部分只是发现节点并找出其中可以ping通的节点,但是还没有进行使用,还没建立TCP连接进行数据传输,协议处理等。
这里分析一下P2P系统的TCP连接池是怎么建立的,以及是怎么跟其他节点通信的。

阅读全文...

分类: geth, GO 标签: , ,

geth以太坊源码分析-P2P模块基于UDP的服务发现机制原理(2)

2018年6月25日 评论 7085次阅读    

上篇文章分析到了p2p模块是怎么通过UDP协议去测试其他节点的连通性的(geth以太坊源码分析-P2P模块基于UDP的服务发现机制原理(1))。接下来分析一下是怎么发现其他邻近节点的。
节点发现主要是findnode, neighbors消息的处理。
阅读全文...

分类: C/C++, geth 标签: , ,

geth以太坊源码分析-P2P模块基于UDP的服务发现机制原理(1)

2018年6月25日 评论 7365次阅读    

以太坊的底层P2P模块承担了节点之间的通信和服务发现,新节点发现连接的功能,对于geth来说,P2P模块氛围2个部分:

  1. 节点发现, 怎么发现附近的其他节点;
  2. 节点连接,怎么去连接其他节点并互相通信;

以太坊使用UDP进行服务发现,通讯内容比较简单,所以没有加密。而使用TCP进行真正的数据传输和交互,这部分是使用加密连接进行传输的。

阅读全文...

分类: geth, GO 标签: , ,

geth以太坊源码分析-P2P服务发现 UDP协议存在死循环没有优雅退出

2018年6月23日 评论 7373次阅读    

geth代码时, 到p2p/discover/udp.go readLoop()函数的处理的时候,直接一个死循环没有监听closing管道,所以基本上是不能优雅退出的。
可能是作者觉得这个不重要,所以没管它?

阅读全文...

分类: C/C++ 标签: ,

geth以太坊源码分析-启动服务2

2018年6月23日 评论 7633次阅读    

上一篇geth以太坊源码学习-启动服务1写到geth()入口函数,这里继续后面看看以太坊是怎么创建一个节点,并且启动服务的。
再看下geth函数,主要是节点创建函数makeFullNode 和启动函数 startNode , 后者会创建协程启动节点,然后进入等待状态。

阅读全文...

分类: geth, GO 标签: , , ,

geth以太坊源码分析-启动服务1

2018年6月23日 评论 7976次阅读    

最近区块链这么火,出于好奇想看看源码实现,比较著名的就是比特币和以太坊了,前者是始祖,后者因为有智能合约的存在,所以大量不会写区块链底层的人可以利用以太坊实现自己的链,实际上,就是ICO, token了。
找了两者的官方源码:比特币以太坊, 由于之前对C,C++源码看的多一些,所以这回趁这机会再了解一下go怎么实现以太坊的。

阅读全文...

分类: geth, GO 标签: , , ,

nsqlookupd 源码分析(2)- topic通道注册,查询代码分析

2018年6月5日 评论 8254次阅读    

上篇文章介绍了一下nsqlookupd 启动服务的简单流程,限于篇幅到这里来写一下nsqlookupd主要的工作:通道注册登记,以及查询服务。
nsqlookupd 有两个主要的功能:

  1. nsqd来注册所有topic、channel的分布信息,nsqlookupd记录哪些topic在哪些机器上;
  2. 给消费端来查询对应的topic所在的机器列表,以供订阅消费;

阅读全文...

分类: GO, nsqd, nsqd 标签: , ,

nsqlookupd 源码分析(1)- 启动服务

2018年6月4日 评论 8279次阅读    

之前的文章写了nsqd的代码逻辑,这里简单介绍一下作为负载均衡或者消息topic/channel汇总的nsqlookupd 的实现原理。相对来说nsqlookupd 比nsqd简单很多,不需要持久化,不需要太多的携程,也没有那么多channel。因此这里简单介绍一下。

nsqlookupd作为其他nsqd的中心,主要负责topic的等级注册,以及channel的登记注册,topic位置查询等服务。生产者一般可以不用连接nsqlookupd,但是消费者在消费时,如果是分布式环境就得连接nsqlookupd,查询指定topic在哪些机器上,进而连接对应的机器,SUB上去消费内容。这里类似redis的集群方案,只是redis集群是纯分散的,而nsqd则是把这个任务交给了nsqlookupd, 这样有利有弊,设计结构复杂一些,但是nsqlookupd的存在让服务维护容易,并且模块清晰一些。

阅读全文...

分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(5)- 消息的订阅流程

2018年5月27日 评论 8621次阅读    

这里记录一下消息的消费者订阅流程,配合上面文章写的消息发送流程。不过这里暂时没讲lookupd的过程,后面在详细介绍。

  1. 消费者使用TCP协议,发送SUB topic channel 命令订阅到某个channel上,记录其client.Channel = channel,通知c.SubEventChan;
  2. 消费者启动后台协程protocolV2.messagePump订阅c.SubEventChan 并得知channel有订阅消息;
  3. 开始订阅管道subChannel.memoryMsgChan/backend, 每个客户端都可以订阅到channel的内存或者磁盘队列里面;
  4. 待生产者调用第四步后,其中一个client会得到消息:msg := <-memoryMsgChan;
  5. 客户端记录StartInFlightTimeout的发送中消息队列,进行超时处理;
  6. SendMessage 将消息+msgid发送给消费者;
  7. 消费者收到msgid后,发送FIN+msgid通知服务器成功投递消息,可以清空消息了;

阅读全文...

分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(4)- 消息的发送流程

2018年5月27日 评论 8641次阅读    

本文从消息发送者的PUB到最后消息被SUB接收,整个流程串起来讲一下nsqd是怎么接收消息的,这部分先写发送流程。

  1. 生产者PUB topic消息;
  2. topic.PutMessage 到 topic.memoryMsgChan;
  3. 每topic消息有后台协程topic.messagePump进行Topic.memoryMsgChan监听;
  4. topic.messagePump 遍历每个channel调用channel.PutMessage发送消息到channel.memoryMsgChan ;

阅读全文...

分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(3)- Channel实现原理

2018年5月27日 评论 8849次阅读    

写一下Channel的实现,比topic相对简单一些,但channel是最接近消费者端的,有他特有的东西,包括投递,确认等;
nsqd的channel的作用在于能对指定的队列topic,进行多份投递,或者说消费,一份队列可以给多个消费者重复消费,有点类似于kafka的consumer_group,每个consumer_group拥有独立的position, 不同group之间可以消费同一份内容的多个副本。
这里稍微做个对比,kafka的已经消费国的消息是可以继续保留的,而nsq则如果消费完了,就会删除掉,也就是没有position可以供回溯,或者重复消费,只要客户端发发送FIN后,消息就会销毁,也不会保留在磁盘上面,这点比kafka简单多了,当然,轻量级消息队列也不太需要这么复杂的功能。

阅读全文...

分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(2)- Topic实现原理

2018年5月22日 评论 9032次阅读    

这回记录一下nsqd的topic是怎么实现的。先以官网一张著名的动图开始, 下面这图介绍了发送一条消息到一个topic上的流程:

阅读全文...

分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(1)- 启动服务

2018年5月19日 评论 9202次阅读    

前段时间了解Go语言,开始了解Go的优秀开源服务,所以找出NSQ学习一下,下载了一份nsq源码开始学习,顺便记录一下阅读的笔记。

对协程实现原理感兴趣的话推荐看一看libtask,几年前在看源码的时候写过2篇笔记,里面有代码和注释:libtask协程库实现源码学习

NSQ是一个实时分布式消息处理服务,支持分布式,其源码包括:
1. nsqd 作为一个主要的消息接受,发送, 跟客户端沟通的后台进程,负责监听客户端连接,处理客户端的发送接收请求;
2. nsqlookupd 是一个管理进程,其他所有nsqd启动会尝试不断连接他,上报topic信息等;
3. nsqadmin 管理进程;
4. 其他便利工具;

阅读全文...

分类: C/C++, GO, nsqd, nsqd 标签: , , ,

让人爱恨交加的Redis Scan遍历操作原理

2018年5月19日 评论 9529次阅读    

还记得,深夜,你在Redis 命令行里敲入"keys *" 后,线上开始报警,然后只能举起双手焦急的等待几千万key被慢慢扫描几十分钟还没结果,束手无策的时候,你跟所有redis用户拥有同样的心声:“就不能温柔点让我遍历一遍所有的数据吗?”
要知道,遍历一下数据库里面的所有数据,是多么理所应当的要求,这在mysql等关系型数据库眼里是多么的不可理解的。

阅读全文...

分类: C/C++, Redis 标签: ,