消息队列

Posted by hqpsoft on May 25, 2016

考虑满足几个方面:

  • 是否持久化
  • 吞吐能力
  • 高可用
  • 分布式扩展能力
  • 兼容现有协议
  • 易于维护
  • 其他,如消息丢失和重复的处理
  • 避免单点故障
  • 负载均衡

常见消息系统协议

  • STOMP
  • AMQP
  • 类似 MEMCACHE 的协议
  • HTTP
  • 自定格式

开源组件:

Kafka/MetaQ

  • 优先考虑持久化的设计,依靠 page cache 管理内存
  • 高吞吐 112MB/s 11K msgs/s (比 beanstalkd >70x 吞吐能力)
  • 支持异步复制
  • 高可用、基于 Zookeeper 的集群设计、支持消费者失效后重新负载均衡
  • Kafka 提供 PHP 类库
  • 支持 ganglia JMX 监控
  • 需要策略避免重复消息, 消费者更新 Zookeeper 的 offset 的方式 (MetaQ 已经提供了几种方式避免消息重复)
  • MetaQ 提供 HTTP 接口

NSQ – Golang

  • 无中心设计、节点自动注册和发现。可以考虑作为内部通讯框架的基础。
  • 追求简单部署
  • 追求高可用、避免单点故障、无中心设计
  • 确保消息送达
  • 生产者消费者自动发现、消费者连接所有生产者、向消费者推的模式
  • 提供 HTTP 接口

文档资料

考虑的点

  • 重试机制:如果ClientB第一次没有执行成功如何对该消息处理
  • 错误处理机制:如果ClientB在重试了N次之后还是异常如何处理该消息
  • 熔断机制
  • 如何对ClientA做一个schedule(计划安排),比如定时发送等
  • 消息审计机制
  • 对消息的各个状态做追踪
  • 事物处理等

Creative Commons License
This work is licensed under a CC A-S 4.0 International License.