NSQ被设计为:
支持高可用和消除单点故障的拓扑结构
实现更强的消息交付保证
单个进程的内存占用(通过将一些信息持久化到磁盘)
极大地简化生产者和消费者的配置要求
提供直接升级的路径
提高效率
简化的配置和管理
nsqd
单个nsqd实例一次性可以处理多个数据流。每个数据流被称为一个“topic”,每个topic拥有一个或多个“channels”。每个channel都会收到从topic发出的所有message的副本(a copy)。通常一个channel是为下流提供消费topic内信息的服务。
topics 和channels并不是提前设置好的。topic是在第一次使用时被发布出来,或者在有channel订阅时被命名的。channel也是同样。
topic和channel都是独自缓存数据的,这防止了存在有缓慢的消费者而导致其他channel堵塞消息的情况。
一个channel通常具有多个消费者连接。如果所有的消费者都在同一个分区里的话,那么从channel分发过来的message将会随机落到每个接受数据流的consumer那里。
message是被topic多路广播的到channel的,channel会将接受到的message随机分发给所有连接了它的consumers,也就是每个consumer只能收到channel通道里的一部分数据。
nsqlookupd
nsqlookupd是为nsqd提供帮助consumer寻找应该订阅的topic的路径服务的帮助程序。根据配置文件,consumer和producer只需要知道去哪里连接nsqlookupd实例就好了,consumer和producer之间是相互独立无需知道对方存在的,这减少了维护的复杂性。
nsqd对nsqlookupd有一个长期的TCP连接,用来通知nsqd的定时的状态,同过这个数据,nsqlookupd会决定向consumer展示哪些nsqd的地址。而consumer则将公开自己的HTTP/lookup 端点。