消息队列入门(一)

消息队列(英语:Message queue)是一种进程间通讯或同一进程的不一样线程间的通讯方式,软件贮列用来处理一系列的输入,一般是来自用户。消息队列提供了异步通讯协议,每个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不须要同时与消息队列互交。消息会保存在队列中,直到接收者取回它。php

组成

Broker:消息服务器,做为server提供消息核心服务
Producer:消息生产者,业务的发起方,负责生产消息传输给broker,
Consumer:消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理
Topic:主题,发布订阅模式下的消息统一聚集地,不一样生产者向topic发送消息,由MQ服务器分发到不一样的订阅者,实现消息的广播
Queue:队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收
Message:消息体,根据不一样通讯协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输redis

使用场景

异步通讯数据库

有些业务不想也不须要当即处理消息。消息队列提供了异步处理机制,容许用户把一个消息放入队列,但并不当即处理它。想向队列中放入多少消息就放多少,而后在须要的时候再去处理它们。
解耦安全

下降工程间的强依赖程度,针对异构系统进行适配。在项目启动之初来预测未来项目会碰到什么需求,是极其困难的。经过消息系统在处理过程当中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,当应用发生变化时,能够独立的扩展或修改两边的处理过程,只要确保它们遵照一样的接口约束。
冗余服务器

有些状况下,处理数据的过程会失败。除非数据被持久化,不然将形成丢失。消息队列把数据进行持久化直到它们已经被彻底处理,经过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除以前,须要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。
扩展性框架

由于消息队列解耦了你的处理过程,因此增大消息入队和处理的频率是很容易的,只要另外增长处理过程便可。不须要改变代码、不须要调节参数。便于分布式扩容。
过载保护异步

在访问量剧增的状况下,应用仍然须要继续发挥做用,可是这样的突发流量没法提取预知;若是觉得了能处理这类瞬间峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列可以使关键组件顶住突发的访问压力,而不会由于突发的超负荷的请求而彻底崩溃。
可恢复性分布式

系统的一部分组件失效时,不会影响到整个系统。消息队列下降了进程间的耦合度,因此即便一个处理消息的进程挂掉,加入队列中的消息仍然能够在系统恢复后被处理。
顺序保证大数据

在大多使用场景下,数据处理的顺序都很重要。大部分消息队列原本就是排序的,而且能保证数据会按照特定的顺序来处理。
缓冲优化

在任何重要的系统中,都会有须要不一样的处理时间的元素。消息队列经过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流通过系统的速度。以调节系统响应时间。
数据流处理

分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,而后进行大数据分析是当前互联网的必备技术,经过消息队列完成此类数据收集是最好的选择。+

框架比较

MQ 语言 支持协议 持久化策略 消息确认机制
RabbitMQ Erlang AMQP STOMP (STOMP 1.0, STOMP 1.1 and STOMP 1.2)MQTTHTTP(有三种方式) 本地磁盘文件 有消息确认机制
ActiveMQ Java AMQPMQTTOpenWireSTOMP AMQ(磁盘文件)、KahaDB(本地数据库)、JDBC、LevelDB(本地数据库) AUTO_ACKNOWLEDGE = 1 自动确认CLIENT_ACKNOWLEDGE = 2 客户端手动确认 DUPS_OK_ACKNOWLEDGE = 3 自动批量确认SESSION_TRANSACTED = 0 事务提交并确认自定义的ACK_MODE:INDIVIDUAL_ACKNOWLEDGE = 4 单条消息确认
ZeroMQ C/C++ zmq_ipc(本地进程间通讯)基于Socket的通讯协议:TCP、INROC 、IPC 、PGM 不支持持久化 无,相似NIO的非阻塞事件
Redis C 自定义redis协议 支持磁盘持久化
Kafka scala 自定义 磁盘持久化 有消息确认机制
相关文章
相关标签/搜索