功能与保证

NSQ 是一个实时分布式消息平台。

功能

  • 支持无单点故障(SPOF)的分布式拓扑
  • 水平可扩展(无代理服务器,无缝添加更多节点到集群)
  • 低延迟基于推送的消息交付(performance
  • 结合负载均衡和多播风格的消息路由
  • 擅长流式(高吞吐量)和作业导向(低吞吐量)工作负载
  • 主要基于内存(超出高水位标记的消息会透明地保存在磁盘上)
  • 运行时发现服务,用于消费者查找生产者(nsqlookupd
  • 传输层安全(TLS)
  • 与数据格式无关
  • 依赖项少(易于部署)且具有合理、有界、默认配置
  • 简单的 TCP 协议,支持任何语言的客户端库
  • HTTP 接口用于统计信息、管理员操作和生产者(发布消息无需客户端库
  • statsd 集成,用于实时指标收集
  • 健壮的集群管理界面(nsqadmin

保证

与任何分布式系统一样,实现您的目标需要做出明智的权衡。 通过对这些权衡的现实情况保持透明,我们希望设定关于 NSQ在生产环境中部署时的行为期望。

  • 消息默认不可持久化

    虽然系统支持一个“释放阀”(--mem-queue-size),在此之后消息将 透明地保存在磁盘上,但它主要是一个基于内存的消息平台。

    可以将 --mem-queue-size 设置为 0,以确保所有传入消息持久化到磁盘。 在这种情况下,如果节点失败,您可能会面临减少的故障表面(即操作系统或底层 IO 子系统是否失败)。

    没有内置复制。但是,有多种方式来管理这种权衡, 例如部署拓扑和技术,这些技术会主动将主题复制并以容错方式持久化到磁盘。

  • 消息至少一次交付

    与上述密切相关,这假设给定的 nsqd 节点不会失败。

    这意味着,由于各种原因,消息可能被交付多次(客户端 超时、断开连接、重入队列等)。客户端有责任执行幂等操作或去重。

  • 接收到的消息无序

    不能依赖消息交付给消费者的顺序。

    与消息交付语义类似,这是重入队列、内存和磁盘存储组合的结果, 以及每个 nsqd 节点互不共享的事实。

    通过在消费者中引入延迟窗口来接受消息并在处理前排序,可以相对简单地实现松散有序(即对于给定的消费者,其消息是有序的,但整个集群中不是), (但是,为了保持此不变量,必须丢弃落在窗口外的消息)。

  • 消费者最终会找到所有主题生产者

    发现服务(nsqlookupd)被设计为最终一致nsqlookupd 节点不协调以维护状态或回答查询。

    网络分区不会影响可用性,因为分区的两侧仍能回答查询。部署拓扑对缓解这些问题有最显著的影响。