消息队列是什么
“消息队列”是在消息的传输过程中保存消息的容器。但是这个队列需要支持高吞吐,高并发,并且高可用。
“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。
消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
消息队列的“前世今生”
消息队列技术最早出现在 1970 年代末期,当时它被用于管理主机之间的打印作业。 随着分布式计算技术的发展,消息队列技术也得到了广泛的应用。
到 1980 年代,消息队列技术已经成为了分布式系统中的标准组件,并被用于许多不同的应用程序,包括电子邮件系统、文件传输系统和远程过程调用系统。
在 1990 年代,随着互联网的普及,消息队列技术得到了进一步的发展。 公司开始使用消息队列来构建分布式系统,以实现数据同步、流量管理和其他功能。
近年来,随着云计算和微服务架构的兴起,消息队列技术又迎来了新的发展机遇。 现在,消息队列通常用于构建可伸缩、高可用的分布式系统,并且在云计算环境中得到了广泛的应用。
消息队列的使用场景
消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削峰和消息通讯四个场景。在实际应用场景中,有队列,发送者和接收者基本的工作原理是:发送者向指定的队列发送消息,该队列让消息入栈,然后当接收者监听指定的队列时,就会接收到来自发送者的消息。
以kafka为例
1、异步处理:用户注册后,需要发注册邮件和注册短信。
2、应用解耦:用户下单后,订单系统需要通知库存系统。
3、流量削峰:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。可以控制活动的人数,可以缓解短时间内高流量压垮应用。
4、日志采集:日志采集端将日志写入kafka队里,开启多个线程消费日志队列,做进一步处理。
常见的消息队列
1、ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。
ActiveMQ的特点:
实现松耦合:消息驱动的应用可以在实现松耦合的同时,及时地感知变化的存在。ActiveMQ同样以异步的形式提供松耦合的应用架构,应用对ActiveMQ的调用不依赖于其它任何应用,消息的生产者并不关心消息是如何及何时被传递的,同样消息的消费者也不关心消息从哪里来或如何来。
遵循JMS规范:ActiveMQ的各种特性是JMS1.1规范的实现。JMS规范保证了同步和异步消息传递、一次和仅一次的传递、对于订阅者的消息持久化。基于JMS规范使得ActiveMQ和其它消息提供者拥有类似的基本特性。
2、RabbitMQ
RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。
RabbitMQ的特点:
可靠性:RAbbitMQ使用一些机制来保证消息可靠性,如持久化,传输确认以及发布确认。
灵活的路由:在消息进入队列之前,通过交换机来路由信息。
扩展性:多个RabbitMQ可以组成一个集群,,也可以根据业务情况动态的扩展集群中的节点。
多语言客户端:RabbitMQ支持非常多的语言,如Java,Python,Ruby,PHP,C#,JavaScript等。
3、Kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。
Kafka的特点:
可靠性高:分布式存储数据,多台服务器集群。
可扩展性强:横向扩展,机器不够加机器。
耐用性好:数据分区存储在每台机器的磁盘上,不易丢失。
性能优秀:顺序读写硬盘策略,不使用寻址磁盘策略。
安全可靠:分区和副本机制保障数据的安全性。