kafka和nsq的区别

在公司经常用到kafka和nsq,对他们的区别很好奇,总结一下:

一.实现原理

1.kafka有topic和partition的概念,Topic 是一个存储消息的逻辑概念,可以认为是一个消息集合。每条消息发送到 Kafka 集群的消息都有一个类别。物理上来说,不同的 Topic 的消息是分开存储的,每个 Topic 可以有多个生产者向它发送消息,也可以有多个消费者去消费其中的消息。每个 Topic 可以划分多个分区(每个 Topic 至少有一个分区),同一 Topic 下的不同分区包含的消息是不同的。每个消息在被添加到分区时,都会被分配一个 offset,它是消息在此分区中的唯一编号,Kafka 通过 offset 保证消息在分区内的顺序,offset 的顺序不跨分区,即 Kafka 只保证在同一个分区内的消息是有序的,因此我们消费Kafka中的数据的时候,可以通过offset保证我们消费到的数据有序,并且可以消费到全量数据和历史数据
2.nsq有topic和channel的概念,Topic 是一个存储消息的逻辑概念。所有的channel都会拿到一份topic传来全部信息传到1个nsqd里,comsumer订阅的不是不仅是topic,还要包含指定channel,一个nsqd接的comsumer数量也可以是多个,nsqlookup会根据comsumer的订阅的channel将其指到特定的nsqd上。

二.使用场景

1.kafka更像是一个消息的分发器件,对于消息的分发实现topic级别的负载均衡,是针对不同消息的处理模式。对同一消息的不同处理,因为kafka本身会将所有消息固化,接不同的comsumer组去处理的时候只要将offset置到指定位置即可
2.nsq比kafka多了一层,对同一消息可能不同业务场景需求也不同,因此用不同的channel去接topic,这样consumer连接channel对应的nsqd去做处理,这是因为nsq本身不做消息的固化,处理完了除了内存里的其他就丢了(除非将 –mem-queue-size 设置为 0)

三.总结

1.kafka消息会固化,存文件,nsq默认是不保存的
2.kafka消息因为固化下来,所以是保序的,nsq传递时候通常是无序的,当然你也可以保留下信息去check时间戳,因此nsq更适合处理数据量大但是彼此间没有顺序关系的消息。
3.Kafka 因为消息在Partition中写入是有序的,同时一个Partition只能够被一个Consumer消费,这样就可能实现消息在Partition中的有序。自定义写入哪个Partition的规则能够让需要有序消费的相关消息都进入同一Partition中被消费,这样达到“全局有序”,即消费者可以按序消费自己订阅的数据。NSQ 因为不能够把特性消息和消费者对应起来,所以无法实现消息的有序性,即所有消费者消费同一份数据,无法按序消费
4.Kafka 使用的拉模型,拉模型能够让消费者自己掌握节奏,但是这样轮询会让整个消费的时延增加,不过消息队列本身对时延的要求不是很大,这一点影响不是很大,NSQ 使用的是推模型,推模型能够使得时延非常小,消息到了马上就能够推送给下游消费,但是下游消费能够无法控制,推送过快可能导致下游过载。
对比如下:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值