北大青鸟郴州科泰中心—XXX
第 1 页 ,共 73 页
1. 为什么要使用消息中间件(MQ)?
下单业务:1)订单系统:生成订单
2)购物车系统:删除购物车数据
3)商品系统:扣除库存
4)支付系统:实现款项扣除
5)短信系统(邮件系统):下单后,短信通知用户
6)优惠券系统:给用户发放优惠券
以上所有系统的操作成功后,才算这个业务执行成功!!!
可以使用消息中间件,完成
1)时间:200(ms)异步处理 消息中间件:把订单数据放入消息队列,然后其他业务系统从消息
队里获取数据,完成自己相应的操作。
MQ 削锋填谷 避免超出服务器负载,把服务器压垮
当前使用较多的消息队列有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分
数据库如 Redis、MySQL 以及 phxsql 也可实现消息队列的功能。
消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系
统的集成。
在介绍 RabbitMQ 之前,我们先来看下面一个电商项目的场景:
商品的原始数据保存在数据库中,增删改查都在数据库中完成。
搜索服务数据来源是索引库(Elasticsearch),如果数据库商品发生变化,索引库数据不能及时更新。
商品详情做了页面静态化处理,静态页面数据也不会随着数据库商品更新而变化。
如果我们在后台修改了商品的价格,搜索页面和商品详情页显示的依然是旧的价格,这样显然不对。
该如何解决?
我们可能会想到这么做:
方案 1:每当后台对商品做增删改操作,同时修改索引库数据及更新静态页面。
方案 2:搜索服务和商品页面静态化服务对外提供操作接口,后台在商品增删改后,调用接口。
这两种方案都有个严重的问题:就是代码耦合,后台服务中需要嵌入搜索和商品页面服务,违背了微
服务的独立原则。
这时,我们就会采用另外一种解决办法,那就是消息队列!
商品服务对商品增删改以后,无需去操作索引库和静态页面,只需向 MQ 发送一条消息(比如包含商
品 id 的消息),也不关心消息被谁接收。 搜索服务和静态页面服务监听 MQ,接收消息,然后分别去处
理索引库和静态页面(根据商品 id 去更新索引库和商品详情静态页面)。
评论10