分布式消息队列
时间:2018-03-01 10:36:05
参考:
应用场景#
-
耗时任务异步处理,提高服务响应速度。
- 发送邮件或验证码。
-
跨系统调用问题。
- 假设有系统A和系统B,A需要调用B的服务,这样A就依赖B系统。使用消息队列,当A需要调用的时候,把消息写入到消息队列,B订阅消息队列,根据消息队列的数据进行任务处理,此时A就不需要依赖B,通过消息队列实现系统解耦。
-
控制系统流量。
-
秒杀活动,往往请求量比较大,可以通过消息队列长度控制请求的去向,当队列已经存储的数据长度大于指定长度之后,把请求直接导流到秒杀结束页面。
-
日志处理 。
- 日志采集器把采集的日志放入消息队列,日志储存程序订阅消息队列,从中读取采集的日志信息,储存到合适的数据存储系统中。
- 新浪是如何分析处理32亿条实时日志的?
-
实时聊天。
- 客户端把要发送的信息写入到消息队列,其它客户端订阅客户端订阅消息队列,可以实现聊天和聊天室。
常用消息队列#
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)