当前位置: 首页 > 科技观察

一文看懂MQ消息队列

时间:2023-03-15 18:42:03 科技观察

MQ(消息队列)在软件架构中经常用到,尤其是在分布式系统中,也是使用频率很高的一个组件。下面详细讲解消息队列的使用场景、概念、常见问题及解决方法。1.消息队列使用场景1.1常见使用场景系统解耦在分布式环境中,系统之间相互依赖最终会导致整个依赖关系混乱,尤其是在微服务环境下,会出现相互依赖,甚至循环依赖的情况会给后期系统的拆分和优化带来很大的负担。那么我们就可以使用MQ进行处理了。上游系统下发数据给MQ,下游系统拿MQ数据消费。发送和消费可以同步处理,因为MQ接收数据的性能非常高,不会影响上游系统的性能。如果异步处理采用同步的方式,系统的性能(并发量、吞吐量、响应时间)就会出现瓶颈。如何解决这个问题呢?引入消息队列异步处理不必要的业务逻辑。异步处理还可以导致使用并行处理手势。在工作中,我们开发了一个简单的基于消息的分布式任务处理组件。组件简单分为三个部分:分段、加载、执行。每个阶段都作为消费者,处理完后作为生产者发送消息。消息消费是无状态的,可以按需无限扩展。流量调峰由于使用了消息,我们的链路变成了一个生产者发送消息,消息中间件存储消息,最后消费者从消息中间件拉取消息的过程。消息中间件的存储能力可以有效帮助消费者缓冲。试想,在正常流量下,消费者可以愉快地消费。当瞬时高峰流量来临时,消费者的消费能力跟不上,正好堵在了消息中间件中。高峰过后,消费者可以快速疏通流量。消息被消耗。切流也是消息队列中常见的场景。一般用于秒杀或者团抢活动!数据分发大多数开源MQ中间件基本都支持一对多或广播模式,可以选择按规则对象分发。这样的上游数据,在众多下游系统中,可以根据规则选择是否接收数据,因此可扩展性很强。1.2消息使用前提条件以上四种是MQ中间件最常见的场景,但是大家想一想,MQ中间件的引入会带来哪些问题呢?那是实时的。所以使用MQ中间件的前提是:可以容忍延迟,只要求最终一致性比较合适。2.消息相关概念MQ的特点先进先出不能说是队列。消息队列的顺序基本在入队时就确定了,一般不需要人工干预。而且,最重要的是,数据只是使用中的一个数据。这也是为什么在很多场景下都会用到MQ的原因。发布和订阅发布和订阅是一种非常高效的处理方式。如果没有阻塞,基本上可以认为是同步操作。这种处理方式可以有效提高服务器的利用率,这样的应用场景非常广泛。PersistencePersistence保证了MQ的使用不仅仅是一些场景的辅助工具,而是让MQ像数据库一样存储核心数据。分布式在大流量、大数据的使用场景下,只支持单体应用的服务器软件基本无法使用。只有分布式部署才能得到广泛应用。而且,MQ的定位是一个高性能的中间件。在JMS标准中,有两种消息模型P2P(PointtoPoint)和发布/订阅(Pub/Sub)。P2P点对点,一次发送,一次消费。涉及的角色有Publisher、Consumer、Queue。一条消息只能被一个消费者消费。消费后,发布者将从队列中移除。发布者与消费者无关。发布者发送消息的行为不会随着消费者而改变。消费者消费消息后需要向队列Ack。当消息队列发现消息消费成功后,就会移除该消息。涉及的角色有Publisher、Topic和Subscriber。特点每条消息对于一个主题(Topic)可以有多个订阅者,必须先创建订阅者才能消费发布者的消息为了消费消息,订阅者必须保持运行。三、常见问题及解决方法消息阻塞1、消息阻塞一般是流量激增,超出了消费者的消费能力;2.或者消费者逻辑有问题,导致不断重试或者长时间等待。第一种可以通过扩容解决,第二种只能紧急修复。发布上线时,阻塞过程中会积压大量消息。这种情况下,也可以考虑临时扩容,重复消费。consumer处理完之后,准备ack的时候出现了问题。应用重启后,消息中间件认为消息未处理,推送给消费者,或者消费者拉取时重复。一般的做法是在消费者端做到幂等。消息丢失消息丢失一般分为生产者发送失败、消息中间件丢失、消费丢失。Producerloss:可能是网络问题或者消息中间处理失败,消息遗漏等原因造成的。消息中途丢失:一般中间件可以设置丢弃策略,大部分MQ中间件产品可以保证数据不丢失。这种情况基本上是不必要的。丢失消费:部分消息中间件支持自动ack。消费者消费消息时,消息中间件会自动确认消费是否成功。这时候一般选择消费者主动ack比较合适。消息顺序消息顺序一般由MQ中间件保证。大多数MQ中间件只能实现偏序,比如Kafka,只能保证单个分区队列的序。有的也会实现全球秩序,但是成本比较高。作者目前服务的公司现已支持全球订单。MQ组件包括activeMQ、rabbitMQ、rocketMQ、zeroMQ、Kafka;有兴趣的同学可以多了解一下。