NSQ 是一个实时分布式消息平台。
与任何分布式系统一样,实现您的目标需要做出明智的权衡。 通过对这些权衡的现实情况保持透明,我们希望设定关于 NSQ在生产环境中部署时的行为期望。
虽然系统支持一个“释放阀”(--mem-queue-size),在此之后消息将
透明地保存在磁盘上,但它主要是一个基于内存的消息平台。
可以将 --mem-queue-size 设置为 0,以确保所有传入消息持久化到磁盘。
在这种情况下,如果节点失败,您可能会面临减少的故障表面(即操作系统或底层 IO 子系统是否失败)。
没有内置复制。但是,有多种方式来管理这种权衡, 例如部署拓扑和技术,这些技术会主动将主题复制并以容错方式持久化到磁盘。
与上述密切相关,这假设给定的 nsqd 节点不会失败。
这意味着,由于各种原因,消息可能被交付多次(客户端 超时、断开连接、重入队列等)。客户端有责任执行幂等操作或去重。
您不能依赖消息交付给消费者的顺序。
与消息交付语义类似,这是重入队列、内存和磁盘存储组合的结果,
以及每个 nsqd 节点互不共享的事实。
通过在消费者中引入延迟窗口来接受消息并在处理前排序,可以相对简单地实现松散有序(即对于给定的消费者,其消息是有序的,但整个集群中不是), (但是,为了保持此不变量,必须丢弃落在窗口外的消息)。
发现服务(nsqlookupd)被设计为最终一致。
nsqlookupd 节点不协调以维护状态或回答查询。
网络分区不会影响可用性,因为分区的两侧仍能回答查询。部署拓扑对缓解这些问题有最显著的影响。