跳转至

分布式消息队列

时间:2018-03-01 10:36:05

参考:

  1. 大型网站架构系列:分布式消息队列(一)

应用场景#

  1. 耗时任务异步处理,提高服务响应速度。

    • 发送邮件或验证码。
  2. 跨系统调用问题。

    • 假设有系统A和系统B,A需要调用B的服务,这样A就依赖B系统。使用消息队列,当A需要调用的时候,把消息写入到消息队列,B订阅消息队列,根据消息队列的数据进行任务处理,此时A就不需要依赖B,通过消息队列实现系统解耦。
    • 控制系统流量。

    • 秒杀活动,往往请求量比较大,可以通过消息队列长度控制请求的去向,当队列已经存储的数据长度大于指定长度之后,把请求直接导流到秒杀结束页面。

  3. 日志处理 。

  4. 实时聊天。

    • 客户端把要发送的信息写入到消息队列,其它客户端订阅客户端订阅消息队列,可以实现聊天和聊天室。

常用消息队列#

RabbitMQ#

  • 简介:RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。
  • 特性:
    • 持久性机制、投递确认、发布者证实和高可用性机制。
    • 集群

ActiveMQ#

  • 简介:ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。
  • 特点:
    • 监控页面:localhost:8161/admin
    • 支持数据持久化 activemq特性之持久化
    • 负载均衡。
    • 主从配置:可以解决单点故障问题,该模式下不支持负载均衡。
    • 安全配置:可以给topic配置用户组的权限。
    • 调度策略:
      • 严格调度策略:可保证不同读取同一个Topic上的内容顺序相同,但是要付出性能损失的代价。
    • 消费者可以指定服务器发送消息的方式(同步或者异步)
  • 参考:

ZMQ(ZeroMQ)#

  • 简介:ZMQ是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。
  • 文档: ZMQ指南zguide
  • 特点:
    • 速度快
    • 消息在订阅者处进行过滤,发布者会向订阅者发送所有消息。
    • 阈值(HWM)的机制,可以避免消息溢出。当队列已满,ZMQ会自动阻塞发送者,或丢弃部分消息,这些行为取决于你所使用的消息模式。
  • 代码:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    import zmq
    import time
    context = zmq.Context()
    
    subscriber = context.socket (zmq.SUB)
    subscriber.connect ("tcp://192.168.55.112:5556")
    subscriber.connect ("tcp://192.168.55.201:7721")
    subscriber.setsockopt (zmq.SUBSCRIBE, "NASDAQ")
    
    publisher = context.socket (zmq.PUB)
    publisher.bind ("ipc://nasdaq-feed")
    
    while True:
        message = subscriber.recv()
        publisher.send (message)