概念
MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka。
在实时消息系统中,MQ消息中间件广泛应用于各类消息系统中,在异步消息处理架构中,MQ几乎是必备的中间件。 同时,MQ的处理性能也将直接影响整个系统的性能。
核心知识
- ActiveMQ是消息队列技术,为解决高并发问题而生
- ActiveMQ基本要素:生产者 producer 、消费者 consumer 、消息服务 broker
- Queue 模式(队列):生产者生产了一个消息,只能由一个消费者进行消费
- Topic模式(发布/订阅):生产者生产了一个消息,可以由多个消费者进行消费
ActiveMQ 消息类型
- TextMessage 文本消息:携带一个java.lang.String作为有效数据(负载)的消息,可用于字符串类型的信息交换;
- ObjectMessage 对象消息:携带一个可以序列化的Java对象作为有效负载的消息,可用于Java对象类型的信息交换;
- MapMessage 映射消息:携带一组键值对的数据作为有效负载的消息,有效数据值必须是Java原始数据类型(或者它们的包装类)及String。即:byte , short , int , long , float , double , char , boolean , String
- BytesMessage 字节消息 :携带一组原始数据类型的字节流作为有效负载的消息;
- StreamMessage 流消息:携带一个原始数据类型流作为有效负载的消息,它保持了写入流时的数据类型,写入什么类型,则读取也需要是相同的类型;
MQ对比
ActiveMQ
- 优点:成熟的产品,已经在很多公司得到应用(非大规模场景)。有较多的文档。各种协议支持较好,有多重语言的成熟的客户端;
- 缺点: 根据其他用户反馈,会出莫名其妙的问题,切会丢失消息。 其重心放到activemq6.0 产品—apollo 上去了,目前社区不活跃,且对 5.x 维护较少;Activemq 不适合用于上千个队列的应用场景
RabbitMQ
- 优点:由于erlang语言的特性,mq 性能较好;管理界面较丰富,在互联网公司也有较大规模的应用;支持amqp系诶,有多中语言且支持 amqp 的客户端可用
- 缺点:erlang语言难度较大。集群不支持动态扩展。
RocketMQ
- 优点:模型简单,接口易用(JMS 的接口很多场合并不太实用)。在阿里大规模应用。目前支付宝中的余额宝等新兴产品均使用rocketmq。集群规模大概在50 台左右,单日处理消息上百亿;性能非常好,可以大量堆积消息在broker 中;支持多种消费,包括集群消费、广播消费等。开发度较活跃,版本更新很快。
- 缺点:产品较新,文档比较缺乏。没有在 mq 核心中去实现JMS 等接口,对
已有系统而言不能兼容。阿里内部还有一套未开源的 MQ API,这一层API可以将上层应用和下层 MQ 的实现解耦(阿里内部有多个mq的实现,如 notify、metaq1.x, metaq2.x,rocketmq 等),使得下面mq可以很方便的进行切换和升级而对应用无任
何影响,目前这一套东西未开源
MQ应用场景
异步处理
场景:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式
解决:通过MQ可以将后续的邮件短信操作进行异步处理,从而可以更快的直接返回结果
应用解耦
场景:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。
解决:订单系统持久化处理订单后,消息写入MQ则返回结果,其它系统从MQ订阅消息
流量削锋
场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。
解决:为解决这个问题,一般需要在应用前端加入MQ。通过用户的请求进入MQ,抛弃超过队列长度的请求,然后对MQ内请求做后续处理
日志处理
指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。
- Kafka:接收用户日志的消息队列
- Logstash:做日志解析,统一成JSON输出给Elasticsearch
- Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能
- Kibana:基于Elasticsearch的数据可视化组件,超强的数据可视化能力是众多公司选择ELK stack的重要原因
消息通讯
MQ内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等