NSQ 是分布式实时消息系统。
对于任何分布式系统来说,都是通过智能权衡来实现目标。通过这些透明的可靠性指标,我们希望能使得 NSQ 在部署到产品上的行为是可达预期的。
虽然系统支持消息持久化存储在磁盘中(通过 --mem-queue-size
),不过默认情况下消息都在内存中.
如果将 --mem-queue-size
设置为 0,所有的消息将会存储到磁盘。我们不用担心消息会丢失,nsq 内部机制保证在程序关闭时将队列中的数据持久化到硬盘,重启后就会恢复。
NSQ 没有内置的复制机制,却有各种各样的方法管理这种权衡,比如部署拓扑结构和技术,在容错的时候从属并持久化内容到磁盘。
如上所述,这个假设成立于 nsqd
节点没有错误。
因为各种原因,消息可以被投递多次(客户端超时,连接失效,重新排队,等等)。由客户端负责操作。
不要依赖于投递给消费者的消息的顺序。
和投递消息机制类似,它是由重新队列(requeues),内存和磁盘存储的混合导致的,实际上,节点间不会共享任何信息。
它是相对的简单完成疏松队列,(例如,对于某个消费者来说,消息是有次序的,但是不能给你作为一个整体跨集群),通过使用时间窗来接收消息,并在处理前排序(虽然为了维持这个变量,必须抛弃时间窗外的消息)。
这个服务(nsqlookupd) 被设计成最终一致性。nsqlookupd
节点不会维持状态,也不会回答查询。
网络分区并不会影响可用性,分区的双方仍然能回答查询。部署性拓扑可以显著的减轻这类问题。