zoukankan      html  css  js  c++  java
  • [MQ]消息队列产品的功能整理

    上篇文章“[MQ]消息队列与企业服务总线的简单比较,MQ&ESB”是宏观概念,这个表格是基于主流MQ产品的功能特性做的初步梳理。重点看了RabbitMQ,其他MQ产品只是简单了解(未论证和研究)。供参考备忘。
    如果有理解上的偏差,也顺手请留言指正。谢谢!

      说明 RabbitMQ ActiveMQ ZeroMQ RocketMQ Kafka Redis
    产品简介   开发语言:Erlang 开发语言:Java 开发语言:C/C++ 开发语言:Java
    阿里参照Kafka设计思想实现的,但对消息的可靠传输及事务性等做了优化。
    开发语言:scala 开发语言:C
    它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。
    产品特点   高并发支持好
    稳定性和可靠性好
      号称最快的消息队列系统,偏重于实时数据通信场景。
    无独立服务器,可当作一个组件库来用。
      追求高吞吐量,一开始的目的就是用于日志收集和传输。  
    协议支持   AMQP
    STOMP(1.0, 1.1,1.2)
    MQTT HTTP(有三种方式) 
    XMPP
    AMQP
    MQTT
    OpenWire
    STOMP
    zmq_ipc(本地进程间通讯)
    Socket(TCP,INROC,IPC,PGM)
    自定义 基于TCP的自定义协议 自定义redis协议
    集群支持   支持 支持 支持 支持 支持
    消息存储   磁盘文件、内存 磁盘文件,本地数据库(KahaDB/LevelDB)、JDBC 不支持(为了提高性能) 磁盘文件 磁盘文件 磁盘文件
    消息交互模式 1.点对点模式(point to point)(p2p)
    保证每个消息都能消费,且只被消费一次(消费者接收到消息后要发送一条确认信息,然后队列就移除该消息)。
    2.订阅发布模式(publish/subscribe)
    广播模式,一个消息人人都可消费(生产者产生消息并发送到指定主题(topic)的队列中,消费者订阅主题(topic),所有订阅者都能拿到消息)。
    3.请求响应模式
    请求端发起请求,并等待回应端回应请求。
    4.管道模式(push pull) <-还没理解清楚,是基于1的变种应用?
    单向发出,每个消息只有一个接收者。
    点对点模式
    订阅发布模式
    点对点模式
    订阅发布模式
    请求响应模式
    订阅发布模式
    push pull模式
    订阅发布模式 订阅发布模式-消费者拉取消息  
    消息的消费模式 支持的两种模式:
    1.push模式(推)
    服务端收到消息后,主动将消息推给消费者。
    优点:实时
    缺点:推送量超过消费者的处理能力,造成消息堆积。

    2.pull模式(拉取) <-轮询?
    服务端收到消息后什么也不做,等者消费者主动来拉取。
    优点:按处理能力拉取
    缺点:实时性低
    push模式(推)
    pull模式(拉取)
    push模式(推)
    pull模式(拉取)
      push模式(推)
    pull模式(拉取)
    pull模式(拉取)  
    消息确认机制 是消息可靠投递的保障手段。ACK-成功,NACK-失败。
    1.生产端消息确认
    生产者投递消息后,如果服务端收到消息,则返回一个应答;
    如果不成功(返回失败或超时),则服务端不会有这个消息,生产端可选择重传等补偿措施。

    2.消费端消息确认
    a)消费者收到消息后,给服务端返回一个应答确认;
    b)分自动确认和手动确认;
    自动确认-消息发送给消费者后立即确认(消费者处理消息时出错会造成“消息丢失”);
    手动确认-消费者指定接收成功与否;
    c)如果不成功(返回失败或超时),会重回队列以及自行实现补偿措施;

    >>根据实现技术又可分为单条确认,批量确认,批量异步确认
    支持 支持   支持  
    消息事务 事务范围是一个消息的投递过程(生产者到服务端,或者服务端到消费者),要么投递成功,要么回滚。目的也保证消息的可靠性。回滚的效果:
    生产者发消息回滚-服务端不会有这个消息
    消费者接收消息回滚-重新放回服务端消息队列
    >>因为事务的性能没有“消息确认机制”高,所以通常不推荐(?)
    支持 支持    
    批量消息 生产端批量发送消息 <-意义? 支持批量发送消息
    支持批量拉取消息-pull模式
    支持批量发送消息 支持 不支持 支持 支持
    延时消息 延时消息/定时消息,主要是投递。
    将消息发送到MQ服务端,但并不立马投递,而是延迟一定时间猜投递(延时消息)或在之后的某个时间点才投递(定时消息)。
    无(但可通过死信队列机制实现) 支持 支持  
    消费者限流机制 消费端为push模式(服务端推消息)时,能够对消息的推送做规则限定。
    如:超过当前处理量限定、消息数据大小限定后暂停推送。
    qos (服务质量保证)功能
    在非自动确认消息的前提下,如果指定数目的消息未被确认前,不消费新的消息。
           
    消息顺序性 其实各个MQ产品都并没严格去实现消息的顺序。
    1.“消费者拿到消息 vs. 消息被处理完”是两个概念,好比“拿到一个任务 vs. 把任务处理完”。而MQ只负责把消息发到消费者,并不涉及处理这个环节。
    2.MQ的单个消息队列,消息都会按放入的顺序被消费(先放入的先被消费)。但消息队列同时能存在多个,如果放入不同队列,也没办法保证顺序。
    3.即便单个消息队列中的消息是有顺序的,但也有异常情况可能打乱这个顺序。如:如事务回滚后重发,就会导致顺序被打乱。
    顺序控制,确实也应该在业务实现层去。
    每队列单消费者有序 每队列单消费者有序 每队列单消费者有序 每队列单消费者有序 有序
    消息优先级机制 优先级高的消息会被优先消费。
    注意,只在有消息堆积的情况下,才存在优先级一说。
    支持 支持        
    消息重发机制 消息收发失败后的重发机制。 支持设置重发策略 支持  
    消息重复机制 也应该在业务层去实现,而不在MQ一层解决。
    在MQ这一层在异常情况下是可能出现消息重复的:重复发布,重复消费。如:网络故障导致消费者消费了消息,但消息队列没得到ACK的接收成功响应。
         
    消息清理机制 超过设定时间则做清除处理。通过设置TTL(Time To Live),即生存时间来实现。 1.发送时指定
    2.队列上指定
    支持   过期删除 过期删除  
    死信队列机制 DLX - 死信队列(dead-letter-exchange)
    不能正常被处理的消息会进入特殊队列。如:
    消息被拒绝,且设置为不重发;
    消息过期被清理(超过TTL)
    队列达到最大长度
    可监听这个队列并做后续处理,有的产品只支持人工干预。
    支持 支持   支持(但放入后只能人工干预)  
    消息路由 根据匹配条件,将收到的消息放置到不同的消息队列。 1.根据发布订阅的主题(Topic)过滤 - 字符串通配符
    2.根据消息头henders匹配 - 是1的加强版,通过多组条件来匹配。消息头可以传入多组值,来用于匹配运算<参见行最后一列的图>。
    支持        
    消息复制 两种情况,特指后者:
    1.在多服务器集群使用时,为了保障消息不丢,复制到其他服务器。
    2.收到消息后,创建消息的副本放入其他队列。
    不直接支持。
    但通过消息过滤能实现
           
    消息过滤 消费者对消息的过滤
    方式一:RocketMQ的 topic ag 方式。tag标签可以看做另一个维度的主题(暂理解为分类),方便消费者按tag来做进一步过滤。
    方式二:ActiveMQ 的selector,配合前端的Stomp的header中的selector实现消息的过滤。
    selector   topic ag 支持  
    消息查询 查询队列消息
    已消费/未消费消息查的询
    消息轨迹的查询
    ...
             

     

    分享请注明出处
    本文链接:https://blog.csdn.net/debug_fan/article/details/105074769

  • 相关阅读:
    cd 好吃的 收藏
    2011 无代码无意义…test 指针 v1
    转 云中漫步的 电子书 from simon
    2011无代码无意义 test_gets_scanf连用 等
    svn—relocate 的原因
    转 CString,string,char*的综合比较
    2011 无代码无意义 test_内存之 变量的边界 (图)
    转 解决"应用程序配置不正确,程序无法启动"
    转 删除已存在的SVN账户信息
    C#中IO类FileInfo和Directory操作实例
  • 原文地址:https://www.cnblogs.com/fj365/p/13295436.html
Copyright © 2011-2022 走看看