RabbitMQ----各个MQ的优劣以及RabbitMQ名词解释原理(一)

RabbitMQ----

什么是MQ?

MQ(message queue),从字面意思上看,本质是个队列,遵循先入先出原则,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递信息。在互联网架构中,MQ是一种非常常见的上限由“逻辑解耦+物理解耦”的消息通信服务,使用MQ之后。消息发送上游只需要依赖MQ,不用依赖其他服务。

为什么使用MQ

1.流量削峰
在流量高峰期,将请求入消息队列中,1秒内的请求,分散到一段时间来处理。可能十几秒才能收到返回结果,但比突然大量请求导致服务瘫痪好。
2.应用解耦
上游将请求放入到消息队列当中,下游从消息队列中消费请求,即使下游突然出现故障,上游请求在消息队列中,当下游修复后,将消息正常返回。用户感受不到下游系统的故障,提升系统可用性。

消息队列能保留消息多久?

3.异步处理
A服务调用B服务,B需要花很长时间执行,以前一般有两种方式,B再提供结果查询接口,或者A提供一个callback接口,B执行完后再通知A,有了MQ之后,A只需监听B处理完的消息,当B处理完成后,会发送一条消息到MQ,MQ将此消息转发给A服务,这样A不用轮询调用B的查询,也不用再提供一个callback接口,同样B也不需要,A服务还能及时得到异步处理成功的消息。

这又需要保证MQ的稳定。

MQ的分类

1.ActiveMQ
优点: 单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用,消息可靠性较低的概率丢失数据,消息丢失概率低。
缺点:社区维护越来越少,高吞吐量场景较少使用
2.Kafka(使用率比较高)
大数据主要应用场景,为大数据而生的消息中间件,百万级别TPS的吞吐量。
优点:性能强,单机写入TPS约在百万条/秒,吞吐量高,时效性ms级,可用性高,kafka是分布式,一个数据多个副本,少数机器宕机,不会丢失数据,消费者采用pull方式获取消息,消息有序,能控制保证所有消息被消费有且仅有一次,有优秀的第三方kafka Web管理界面Kafka-Manager,在日志领域比较成熟,被多家公司和开源项目使用。
功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用
缺点:Kafka单机超过64个队列分区,Load会发生明显的飙高现象,队列越多,load越高,发送消息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试,支持消息顺序,但是一台代理宕机后,会产生消息乱序,社区更新较慢。
3.RocketMQ
来自Alibaba,用Java实现。
优点:单机吞吐量十万级,可用性高,分布式架构,消息可以做到0丢失,MQ功能较为完善,分布式,扩展性好,支持10亿级别的消息堆积,不会因为消息堆积导致性能下降,源码是JAVA,可以自己月度源码,定制自己公司的MQ
缺点:支持的客户端语言不多,目前是java以及c++,其中c++不成熟,社区活跃度一般,没有在MQ核心中去时间JMS等接口,有些系统要迁移需要使用大量代码。

如何保证消息0丢失的?

4.RabbitMQ
是一个再AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统。
优点:由于erlang语言的高并发特性,性能好,吞吐量到万级,MQ功能比价晚上,跨平台,支持多种语言,如Python、Ruby、java、C等,支持AJAX文档齐全,社区活跃度高,有开源管理界面,易于操作。
缺点:商业版需收费,学习成本高。

MQ的选择

1.kafka
主要特点基于Puul的模式处理消息消费,追求高吞吐量,一开始用于日志收集和传输,适合大量数据的互联网服务的数据收集业务,大公司建议选用,以及有日志采集功能,首选kafka。
2.rocketMQ
适合金融互联网领域,尤其电商,可靠性高,毕竟经历过双11的考验。
3.RabbitMQ
erlang语言本身的并发优势,时效性微秒级,管理界面方便使用,适合数据量没那么大,中小型公司使用较为完备的RabbitMQ。

RabbitMQ

1.概念

RabbitMQ是一个消息中间件,接收并且转发消息,本身不处理消息,但接收、以及存储和转发消息。

2.四大核心概念

1.生产者
产生数据发送消息的服务。
2.交换机
交换机是RabbitMQ的重要组件,一方面接收来自生产者的消息,一方面将消息推送到队列中,交换机必须确切知道如何处理它接收的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是将消息丢弃,由交换机类型决定。
3.队列
队列是RabbitMQ内部使用的一种数据结构,尽管消息流经RabbitMQ和应用程序,但它们只能存储到队列中,队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区,许多生产者将消息发送到一个队列,许多消费者可以尝试从一个队列中接收数据,这就是使用队列的方式。一般一个消费者对应一个队列
4.消费者
处理消息请求的服务。
交换机和队列是绑定的关系,交换机可以和多个队列进行绑定。

RabbitMQ的六种模式

1.hello world简单模式
2.work queues工作模式
3.Pulish/Subscribe发布/订阅模式
4.Routing路由模式
5.Topics主题模式
6.Publisher Confirms发布确认模式

RabbitMQ工作原理

RabbitMQ----各个MQ的优劣以及RabbitMQ名词解释原理(一)_第1张图片
Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker。
Virtual host:出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念,当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
Connection:消费者和生产者与RabbitMQ 之间的TCP连接。
channel:信道,发消息的通道,如果每次访问RabbitMQ 都建立一个Connection,在消息量大的时间建立TCP Connection的开销是巨大的,效率也低,channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel。所以channel之间是完全隔离的,channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
Exchange:message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去,常用的类型有:direct(point-to-point),topic(pulish-subscribe),和fanout(multicast)。
Queue:队列
Binding:exchange和queue之间的虚拟连接,binding中可以包含routing key,Binding信息被保存到exchange中的查询表中,用于message的消息分发。

你可能感兴趣的:(Java框架,java-rabbitmq,rabbitmq,java)