Distributed message queue NSQ and Comparative Kafka
Action message queue
- Decoupling, adding a layer of a flow data interface split into two portions, dedicated notification upstream, downstream processing focused
- A buffer, a sudden rise in response to changing traffic, the message queue has good cushioning effect clipping
- Asynchronous, the upstream message can be returned immediately after transmission, the downstream processing to be
- Broadcast message is processed so that a plurality of downstream
- Redundancy, save the message processing, message processing to prevent data loss caused by failure
1. Same
都是消息队列
2. Different
NSQ自带lookup服务,方便集群下部署拓展,kafka则需要zookeeper配合服务发现
NSQ用golang实现,kafka用java实现,语言不同
NSQ中consumer是被动接受消息,kafka可以主动选择消费类型
NSQ消息是无序的,kafka消息是有序的
NSQ消息默认储存在内存中,只有超过–mem-queue-size才会存储到硬盘中,kafka默认存储在硬盘 中
3. Comparison
a. store
- NSQ 默认是把消息放到内存中,只有当队列里消息的数量超过–mem-queue-size配置的限制时,才会对消息进行持久化。
- Kafka 会把写到磁盘中进行持久化,并通过顺序读写磁盘来保障性能。持久化能够让Kafka做更多的事情:消息的重新消费(重置offset);让数据更加安全,不那么容易丢失。同时Kafka还通过partition的机制,对消息做了备份,进一步增强了消息的安全性。
b. Push model
- NSQ 使用的是推模型,推模型能够使得时延非常小,消息到了马上就能够推送给下游消费,但是下游消费能够无法控制,推送过快可能导致下游过载。
- Kafka 使用的拉模型,拉模型能够让消费者自己掌握节奏,但是这样轮询会让整个消费的时延增加,不过消息队列本身对时延的要求不是很大,这一点影响不是很大。
c. sequence of the message
- NSQ 因为不能够把特性消息和消费者对应起来,所以无法实现消息的有序性。
- Kafka 因为消息在Partition中写入是有序的,同时一个Partition只能够被 Consumer Group 中的一个Consumer消费,这样就可能实现消息在Partition中的有序。自定义写入哪个Partition的规则能够让需要有序消费的相关消息都进入同一个Partition中被消费,这样达到”全局有序“