淘淘商城第68讲——ActiveMQ简介

同步索引库分析

我们在之前学习将搜索功能切换到Solr集群版的时候,每当新添加一个商品后,都要把数据库中的数据全部重新导入一遍到索引库中,这会特别消耗性能和时间,显然是我们所不能忍受的,这就需要优化我们的方案了,最好是在商品添加的时候就单独将该商品同步到索引库中,这样便简单快捷地实现了数据库与索引库的同步,而摆在我们面前的方案有三个。

方案一

在taotao-manager工程添加商品的业务逻辑中,添加一段同步索引库的业务逻辑。
在这里插入图片描述
这种方案的缺点是啥呢?很明显,这样会导致业务逻辑耦合度变得将非常高,而且业务逻辑拆分将变得不明确,这与我们当初拆分工程,职能单一、明确的原则相违背,故不可采用。

方案二

业务逻辑在taotao-search中实现,调用服务在taotao-manager中实现,将业务逻辑分开。
在这里插入图片描述
这种方案的缺点是啥呢?服务与服务之间耦合度变高,而服务的启动有先后顺序。本身添加商品是服务层工程的业务,服务层工程里面又调用其他的服务层工程,那么将来我们在启动这些工程的时候,是不是得有先后顺序啊!正是因为有先后顺序,将来启动这些工程就一定会报错,虽说这个错误我们是可以不理的,但是日志一输出来,你都不知道到底是哪一个真的报错了,到底是说有问题呢,还是说没问题。

而且随着调用的服务越来越多,服务之间的调用就会变得越来越复杂,难以管理。但是,咱们服务设计的原则便是各自干各自的活儿,启动要保证互不依赖,服务之间不应该有调用行为,一旦有调用行为,依赖的一方便会因被依赖一方出现故障而无法工作。

方案三

使用消息队列,MQ是一个消息中间件,如下图所示。
在这里插入图片描述
在这种方案中,搜索系统获取到商品的id后,通过数据库查询出最新的数据,然后更新到索引库中。不过这种方案也存在着两个问题:

  1. 如果MQ挂了,那么所有相关的服务都挂了。其实这个问题好解决,我们可以做一个备份,一主一备,若一个挂了,另外一个就顶上来
  2. MQ有性能的瓶颈,应尽量减少消息的内容的大小

怎么理解消息中间件呢?我们可以把它理解成一个秘书,消息的发布者就是大老板,大老板下午三点要开个会,他只需跟秘书说一声,下午三点,我要开个会,就行了,老板不用管秘书是怎样通知各项目经理的,也不用管项目经理要带什么材料,他所做的只是告诉秘书一声而已。秘书负责与各个项目经理联系,告诉各个项目经理应该准备什么,MQ便相当于"秘书"这个角色。当添加一个商品时,商品服务只需要告诉消息中间件MQ,MQ便去通知其它服务做各自该做的事情,比如通知搜索服务去同步索引库,通知Redis服务去同步缓存,通知生成静态页面等等。

最后,我还得说一点,如果MQ真的挂了,那么你必须通过日志查找原因,然后通知相关的人员修复,最重要的一点是关键的业务必须保证有备用方案。

简要介绍一下ActiveMQ

什么是ActiveMQ?

ActiveMQ是Apache出品、最流行的、能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1规范和J2EE1.4规范的JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中仍然扮演着特殊的地位。ActiveMQ主要有如下特点:
在这里插入图片描述
我还得补充一点,MQ是一个消息中间件,常见的作为MQ的中间件有:

  1. ActiveMQ
  2. RabbitMQ
  3. RocketMQ
  4. Kafka

这么多消息中间件,那在实际开发中,我们应该选择哪一个呢?记住一句话,技术的选型和具体的业务有关,只选择最合适的技术。

我们今天要学习的是ActiveMQ,其实其它的都大同小异。你可能要问了,什么时候我们需要用到MQ呢?为了实现系统之间的通信,在想把系统之间调用的耦合度降低的情况下都可以使用MQ。

ActiveMQ的消息形式

ActiveMQ对于消息的传递有两种类型:

  1. 一种是点对点的,即一个生产者和一个消费者一一对应
  2. 另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收

我们可以通过下面两张图来加深对ActiveMQ的理解,下图表示的是点对点模式,三个发布者各自发布了一条消息,压入队列当中,队列的特点是先进先出,一旦有某个消费者拿走了一条消息,队列中就少了一条消息,剩下的消费者就不可能再消费那条消息了,因此也就做到了一对一。
在这里插入图片描述
再来看下面这张图,它表示的是发布/订阅者模式,三个发布者各自发布了一条消息,每条消息都可以被多个Consumer接收到。
在这里插入图片描述
JMS规范定义了五种不同的消息正文格式以及调用的消息类型,允许我们发送并接收以下一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

  • StreamMessage:Java原始值的数据流
  • MapMessage:一套名称-值对
  • TextMessage:一个字符串对象
  • ObjectMessage:一个序列化的Java对象
  • BytesMessage:一个字节的数据流

注意:我们用的最多的也就是TextMessage而已。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李阿昀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值