Kafka & NSQ
Kafka
kafka struct
kafka & consumer group 2
kafka group 3
图中说明一个consumer 可以消费多个partition (一般配置的partition有10个)
但是一个partition 只能连接一个consumer
Consumer 可以认为是消费者服务的实例
多个consumer可以组成一个组,每个消息只能被组中的一个consumer消费,
(所以一个partition对应的在同一个组中对应的consumer只有一个)
如果一个消息可以被多个consumer消费的话,那么这些consumer必须在不同的组。
(正如图3 中的两个不同颜色的线 虽然是同一个内容的消息 但是去往不同的组)
一个partition,只能被消费组里的一个消费者消费,但是可以同时被多个消费组消费
每个主题有多个分区,不同的消费者处理不同的分区,所以Kafka不仅保证了消息的有序性,也做到了消费者的负载均衡。
因为经常说到partition可以用于负载均衡 一个消息只会进入其中一个partition
自己的实验也证实了这种猜测
Kafka 分布式
Kafka 的生产者和消费者相对于服务端而言都是客户端,生产者客户端发布消息到服务端的指定主题, 会指定消息所属的分区。生产者发布消息时根据消息是否有键, 采用不同的分区策略。消息没有键时,通过轮询方式进行客户端负载均衡消息有键时,根据分区语义确保相同键的消息总是发送到同一个分区。
image.png
NSQ
https://cdn-images-1.medium.com/max/1600/1*rlL7_0y1aBuvA7jU7E4lig.png
对于发往Topic的消息,nsqd向该Topic下的所有Channel投递消息,而同一个Channel只投递一次
Channel下如果存在多个消费者,则随机选择一个消费者做投递。这种投递方式可以被用作消费者负载均衡。
关于可靠性
at-least-one模式,至少发送一次,
time-out重传,因此consumer可能会接收重复数据。
nsqlookupd
会监听两个端口:
http: 4161 客户端用它来发现和管理。
tcp: 4160 nsqd 用它来广播
nsqd
会监听两个端口:
http: 4151
tcp: 4150
nsqd 是一个守护进程,负责接收,排队,投递消息给客户端。
nsqadmin
监听一个端口
http:4171
写入数据pub(publish)
一个POST请求
curl -d 'hello world 1' 'http://127.0.0.1:4151/put?topic=test'
网友评论