NSQ
概念
Topic
队列名称channel
每个channel都会接收消息nsqd
channel运行的载体nsqLookupd
类似服务发现,channel向nsqLookupd注册,consumer在nsqLookupd发现channel
特点
- NSQ 是基于内存的(超出内存限制部分会存储到磁盘),故障时会丢数据
- 保证最基本的at least once
- 数据是无序的
- 数据是不可回溯的
- push 模型,将数据主动推送给消费者
- 与Kafka相比,吞吐一般
- 没有备份机制
- requeue和defer机制,可以将消息重新送入队列、延迟消费数据,任务队列的重试机制
Kafka
概念
Topic
队列的名称和NSQ的概念相同partition
数据均匀的分布在partition中broker
partition 运行的载体
特点
- 数据写入到磁盘,故障时数据不丢失
- 可以保证exactly once
- 数据是有序的(单个partition而言)
- 数据是可以回溯一段时间的
- pull模型(批量拉取数据),可以有多个消费者,同时主动从partition中拉取数据(一个partition 对一个消费者而言,只能有一个进程)
- 比NSQ的吞吐量大
- 有备份机制(写入数据的时候,可以指定成功写入几个备份,确认写入成功),在实际项目中因为备份的确认机制,导致过性能较低的问题。
- 没有requeue和defer机制
Rebalance机制
一个消费者消费Kafka的时候,一个partition最多只有一个consumer对应,一个consumer可以消费多个partition
watch zookeeper 机制,当partition和consumer发生变化时,进行rebalance 牧群效应:一个consumer发生变化,导致整个集群进入rebalance状态 脑裂: 暂时没有搞懂这个词
Kafka高可用性的原因
- batch send 批量发送机制
- compression broker提供压缩服务
- ISR 备份机制,可以选择几个备份成功,算是投递成功
- append only 顺序写磁盘,速度快
- page cache 数据可以在写入磁盘之前被消费者消费
- zero copy 使用DMA->内核buffer->网卡,没有重复复制的开销