消息队列

什么是消息队列

消息队列,即MQ,Message Queue。


消息队列

消息队列是典型的生产者-消费者模式。消息队列采用异步的方式进行工作,生产者和消费者互不干扰没有业务逻辑的入侵,只关心消息的发送和接收,从而实现了生产者和消费者的解耦。

AMQP和JMS

MQ是消息通信模型,并不是具体实现,而具体实现MQ的有两种主流方式:AMQP、JMS

    AMQP:一个提供统一消息服务的应用层标准高级消息队列协议,客户端与中间件传递消息不受开发语言限制。

    JMS:Java应用提供统一的消息操作,仅限于Java语言。

AMQP和JMS的区别

    a)JMS定义统一接口对消息操作进行统一,AMQP通过规定协议来统一数据交互的格式。

    b)JMS限定Java语言,AMQP不限定语言

    c)JMS规定两种消息模式,AMQP支持多种消息模型

常见的MQ产品

ActiveMQ:基于JMS

RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好

RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会

Kafka:分布式消息系统,高吞吐量

为什么需要中间件(MQ)

在高并发下系统来不及同步处理,请求往往会发生堵塞。消息队列是异步处理,对业务进行解耦和减少请求时间、同时对大并发量进行限流/削峰减小系统的压力。

使用消息队列有什么问题

         高可用:消息队列不能是单机模式一旦消息队列挂掉整个系统将不可用,所以系统采用集群/分布式要做必然希望消息队列能提供现成的支持。(补充:所有的高可用都是通过RPC和存储的高可用来做的。而消息队列的高可用,只能保证broker接受消息和确认消息的接口是幂等的,consumer处理消息是幂等这样系统的可用性就交由RPC进行处理,采用共享存储来保证幂等,broker多设备共享一个DB/一个分布式文件,则处理消息自然是幂等。当单点故障时,其他节点将自动补上,另外failover可以依赖定时任务的补偿,这是消息队列本身天然就可以支持的功能。对于不共享存储的队列,如Kafka使用分区加主备模式。)

         数据丢失问题:消息队列如果挂掉数据将丢失,要做到数据不丢失那么消息队列要做到同步存储还是异步存储,存储在哪磁盘、数据库、redis、分布式文件系统(个人所知道的一种模式是异步存储在消息存放进消息队列时同时把数据存入数据库,当消息队列一旦挂掉就采用数据库数据)

         消费者怎么得到消息队列的数据:

            a)生产者将数据放入队列,队列有数据后主动去通知消费者进行消费

            b)消费者不断的轮训队列,当队列中有新数据则进行消费

         其他问题

            a)消息重复消费怎么办?

                   解决方案:增加消息状态表,用来记录消息的处理状态,每次处理消息之前都去表中查询一次,如果已经有相同的消息存在,那么不处理防止消息重复消费。

            b)如何保证消息是绝对有顺序的?

        如何避免消息丢失?

            a)消费者的ACK机制,可以防止消费者丢失消息

            b)消息进行持久化(消息持久化的前提是队列交换机持久化)

IBM WebSphere MQ

IBM WebSphere MQ 支持两种不同的应用程序接口:java消息服务(JMS)和消息队列接口(MQI)。在IBM服务器上,JMS的绑定方式被映射到MQI。

IBM WebSphere MQ 编程原理:程序和队列管理器连接,程序通过MQ Connect调用进行连接Queue Manager。当要在队列上存储数据时则调用MQ Open打开一个队列,使用MQ Put将数据存放到队列上。要接受数据,应用程序调用MQ Get接受队列上的数据。

消息通道代理(MCA)使用TCP/IP、SNA将消息从本地传输队列移到目标队列管理器(Queue Manager)。

通道出口是用户写入库,可以在通道运作期间,从已定位位置号之一进入这些库。

通道出口和对象权限管理器(OAM)提供访问控制功能。程序的每个请求传递给OAM,OAM将根据访问控制表授权或拒绝访问。OAM只提供授权服务,不提供数据保护。

OAM、通道出口、MCA三个组件对IBM WebSphere MQ的安全性解决方案。


IBM WebSphere MQ 编程的原理


Rocket MQ

         动机:在早期阿里团队在使用Active MQ 5.x基础上构建队列,但随着业务量的增加队列越来越长,Active MQ的IO达到一个瓶颈,阿里团队尝试使用节流、断路器、降级来解决都无果,当时最新的消息解决方案kafka也无法满足阿里团队的低延迟和高可用的两个需求,因此Rocket MQ孕育而生。

Rocket MQ三种发送方法:可靠同步发送、可靠异步发送和单向发送

             可靠同步发送:多用于重要的通知消息、短信通知、短信营销系统;

             可靠异步发送:用于对响应时间敏感的业务场景;

             单向发送:用于要求一定可靠性的场景,例如日志收集;

Rabbit MQ五种消息模型:

        基本消息模型:生产者将消息发送到队列,消费着从队列中获取消息,队列是储存消息的缓冲区

                消息确认机制:确认消息是否被接收

                自动ACK:消息一旦被接收,消费者自动发送ACK(生产者出现异常时消费者还是能正常消费)

                手动ACK:消息接收后,不会发送ACK,需要手动调用

        work消息模型:创建一个工作队列,在多个工作者之间分配耗时任务。主要思想是避免执行资源密集型任务,适用于Web程序因为在短的HTTP请求窗口无法处理复杂的任务。

        订阅模型分类:生产者将消息发送给交换机,交换机只做消息转发不做存储,再由交换机发送给队列,每个消费者都有自己单独的队列,实现一条消息被多个消费者消费

                订阅模型-Fanout:生产者发送消息给交换机,交换机来决定发给哪个队列实现一条消息被多个消费者消费

                订阅模型-Direct:消息发送方在发送给交换机时同时指定路由KEY,指定路由KEY绑定特定的消费者

                订阅模型-Topic:Topic和Direct不同的,Topic绑定路由KEY可以使用通配符

Active MQ

        ActiveMQ是apache提供的开源的,实现消息传递的一个中间插件,可以和spring整合,是目前最流行的开源消息总线,ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。较相似的还有rabbitMQ和kafka等,都是最为消息传递的插件。

        Active MQ传递消息的两种方式点对点方式、发布/订阅方式

                点对点方式(PTP):一个消费者对应一个生产者

                发布/订阅模式(Publish/Sub):一个生产者产生消息发送后,可以被多个消费者进行接收。

        JMS定义了五种消息正文格式,以及消息的调用类型,允许发送和接收一些不同类型的数据,提供现有消息格式的一些级别的兼容性。

            StreamMessage:--JAVA原始的数据流

            TextMessage:一个字符串对象

            ObjectMessage:一个系列化的java对象

            BytesMessage:一个字节对象

            MapMessage:key/value方式的键值对

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容