zoukankan      html  css  js  c++  java
  • 消息队列技术之基本概念(转)

    原文地址:消息队列技术之基本概念

    最近一直在总结Azure Messaging ServiceBus Messaging相关的技术:消息顺序、消息持久化、复杂对象消息的序列化、消息事务、消息回执等机制。

    感觉有必要补充一篇消息队列技术的基本概念,无论RabbitMQ、ActiveMQ还是其他,都有的一些基本概念、术语、机制,分享给大家,希望大家在搞消息队列技术的时候能够快速

    理解、排上用场。

    1. 消息生产者、消息者、队列、主题

    消息生产者Producer:发送消息到消息队列。

    消息消费者Consumer:从消息队列接收消息。

    消息队列Queue:一个先进先出的消息存储区域。消息按照顺序发送接收,一旦消息被消费处理,该消息将从队列中删除。

    主题Topic:一种支持消息多个订阅者的机制。

    2. 点对点/Queue消息队列模型

    一个生产者向一个特定的队列发送消息,一个消费者从该队列中接收消息;

    消息的生产者和消费者可以不同时处于运行状态。

    每一个成功处理的消息都由消息消费者签收确认(Acknowledge)。如图:

    3. 发布订阅消息模型Topic

    发布订阅模型中,支持向一个特定的消息主题Topic发布消息。0个或多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方,这种

    模式被概括为:

    多个消费者可以获得消息在发布者和订阅者之间存在时间依赖性,即必须先订阅,再发送消息,而后接收订阅的消息,这个操作顺序必须保证。如图:

    4. 消息的顺序性保证

    基于Queue消息模型,利用FIFO先进先出的特性,可以保证消息的顺序性。

    5. 消息的ACK机制

    即消息的Ackownledge确认机制,

    为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制,当Consumer确认消息已经被消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消

    息了。如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理。

    (个人认为消费方还要注意消费消息的幂等性。)

    6. 消息的同步和异步收发

    同步:消息的收发支持同步收发的方式。同时还有另一种同步方式:同步收发场景下,消息生产者和消费者双向应答模式,例如:张三写封信送到邮局中转站,然后李四从中转站获

    得信,然后在写一份回执信,放到中转站,然后张三去取,当然张三写信的时候就得写明回信地址。

    消息的接收如果以同步的方式(Pull)进行接收,如果队列中为空,此时接收将处于同步阻塞状态,会一直等到消息的到达。

    异步:消息的收发同样支持异步方式:异步发送消息,不需要等待消息队列的接收确认;异步接收消息,以Push的方式触发消息消费者接收消息。

    7. 消息的事务支持

    消息的收发处理支持事务,例如:在任务中心场景中,一次处理可能涉及多个消息的接收、处理,这应该处于同一个事务范围内,如果一个消息处理失败,事务回滚,消息重新回到

    队列中。

    8. 消息的持久化

    消息的持久化,对于一些关键的核心业务来说是非常重要的,启用消息持久化后,消息队列宕机重启后,消息可以从持久化存储恢复,消息不丢失,可以继续消费处理。

    9. 消息队列的高可用性

    在实际生产环境中,使用单个实例的消息队列服务,如果遇到宕机、重启等系统问题,消息队列就无法提供服务了,因此很多场景下,我们希望消息队列有高可用性支持,例如

    Azure ServiceBus Messaging就有高可用保障机制;RabbitMQ有镜像+HAProxy的高可用性方案,ActiveMQ也有基于LevelDB+ZooKeeper的高可用性方案。这点大家在

    实际技术选型时需要重要考虑,云端的MQ服务,比如Azure Messaging的SLA就承诺了99.9%, 也是非常推荐的。

    以上是最近这一年研究消息队列MQ技术的一些简单梳理和归纳,分享给大家,希望对大家有帮助。

  • 相关阅读:
    《JavaScript高级程序设计》笔记:变量、作用域和内存问题(四)
    《JavaScript高级程序设计》笔记:基本概念(三)
    jQ效果:jQuery之插件开发短信发送倒计时功能
    《JavaScript高级程序设计》笔记:在HTML中使用Javascript(二)
    大数据测试大纲
    测试架构师
    大数据的测试思维与探索
    大数据测试
    一个java创建,删除,构建Jenkins等功能的JenkinsUtil工具类
    测试自动化平台 | 测试开发工程师的进阶之路
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/7728504.html
Copyright © 2011-2022 走看看