
目录
一、认识消息中间件
二、消息中间件的比较
三、RabbitMQ介绍
四、AMQP协议
官方说法(维基百科)就是:面向消息的系统(消息中间件-Message oriented middleware,简称MOM)是在分布式系统中完成消息的发送和接收的基础软件。
消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。
emmm~从上面我们大概知道了消息中间件的定义,下面我用张图来展示这玩意在真实的项目中所处的地位,或者说位置是啥~
》》》假设上面是一个正儿八经的微服务架构的商城系统(随便画的,里面一些细节经不起推敲不用在意)。假如现在有一个需求,用户在商城下订单支付成功之后,需要发起物流服务、更新用户的积分等,那么正常代码就是如下:
//伪代码
//1、下单(可以不在当前步骤接口中,为了流程写出来)
orderService.makeOrder();
//2、支付
boolean success=payService.pay();
if(success){
//3、物流
transportService.tran();
//4、积分
jfService.up();
}else{
}
//最后返回给用户支付成功的
return success;
从上面的流程,就可以看出,在这个小小的接口中,就需要涉及至少3个服务的调用,并且在代码中可以看出是顺序调用,那么就会出现如下的一些问题:
》》》因此,我们需要解决的问题就是:服务之间的解耦、以及将影响降到最低,那么此时我们就考虑是不是可以进行异步的处理方式,同时进行一些特殊处理,譬如使用公共的任务池。
//伪代码-plus
//1、下单(可以不在当前步骤接口中,为了流程写出来)
orderService.makeOrder();
//2、支付
boolean success=payService.pay();
if(success){
//创建一个任务池
TaskPools pools = new TaskPools();
//3、物流任务异步处理
pools.start(transportTask.class);
//4、积分任务异步处理
pools.start(jfTask.class);
}else{
}
//最后返回给用户支付成功的
return success;
从上面优化后的代码可以看出,我们将不重要的服务,通过异步任务的方式放在任务池中进行处理,这样就可以避免小流程影响主流程的问题。但是这样同样会存在一些问题:
是不是越想越头大~~~其实还有很多需要解决的问题要去考虑的呀,例如:网络通信、协议、回调、持久化、丢弃策略、分配策略等等。那么此时,我们的消息中间件就隆重登场了!!!
消息中间件本身就具备以下特性:
我们自己也可以自制一个简单的单机版的消息中间件,来大概知道他的基本理念。可以通过Java的BlockingDeque来自制,不过也就图一乐,代码就不贴了。
说说市面上的消息中间件吧:
下面用图的方式来展示后面三款的一些比较吧~ActiveMQ就不谈了,不给他面子~
从上面的图就可以看出,为啥中小型公司喜欢用RabbitMQ了吧,首先就是轻量,其次就是本身公司的量级不大,使用KAFKA或者RocketMQ就有点大材小用了~~~其实就算大厂,也不一定没个部门都有像淘宝、像京东这样的体量吧,其实大厂的一些部门也是有很多做内部系统或者轻量级项目的!!!
因此,项目体量不大就RabbitMQ,超过十万就看喜好~
说了这么多,回到最初的主题,咱们的小兔子:RabbitMQ~~
引用《RabbitMQ实战》的话:RabbitMQ是一款轻量级的、功能强大的工具,可以用来构建简单的或异常复杂的分布式软件架构。他具备以下特性:
简单聊聊AMQP协议吧~
AMQP全称高级消息队列协议(Advanced Message Queuing Protocol),是一种标准,类似于JMS,兼容JMS协议。目前RabbitMQ主流支持AMQP 0-9-1,3.8.4版本支持AMQP 1.0。
其实AMQP协议中的一些概念,就是RabbitMQ中的一些概念:
具体的协议内容,后面看看是否单独拿一章来说~~
本章就到此结束~后面会慢慢介绍Rabbit安装、高级特性以及高级应用,同时还有实战~~~Bye!