初探消息队列,了解消息队列的作用~

159 阅读6分钟

最近在学习消息队列方面的知识,因此想做个总结归纳,欢迎大家评论区随时指正~

消息队列介绍

在我们日常开发中,消息队列可谓是老生常谈。简单来说,消息队列主要用于分布式分布式系统中进行异步通信的一类中间件技术。事实上,消息队列可以看作是存放数据的容器,通过消息队列,我们能够在不同系统、不同服务之间以消息的方式进行数据的交流传递。

消息队列术语

我们可以以Kafka为例,简单介绍一下消息队列中的常见术语。

  • 消息(Message):消息队列主要存放的数据对象。
  • 主题(Topic):消息队列存放消息的数据容器,承载消息的逻辑容器,在实际开发中,不同的业务场景会使用不同的TopicTopic主要用于区分具体的业务。
  • 分区(Patition):分区是一种将消息队列中的数据分割成多个部分的机制,将发送给一个Topic的消息数据进行分割,提高消息的处理性能,且分区是一个有序不变的消息序列。
  • 消息位移(Offset):标识分区中每条消息在分区中的位置的唯一标识符。
  • 生产者(Producer):向Topic发布新消息的应用程序。
  • 消费者(Consumer):从Topic订阅新消息的应用程序。
  • 副本(Replica):将同一条消息拷贝到多个地方作为数据冗余,即副本。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
  • 消费者组(Consumer Group):多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
  • 消费者位移(Consumer Offset):表示消费者在分区消费消息的进度,每个消费者都有自己的消费者位移。

image.png

消息队列的作用

在我们的实际开发中,消息队列主要用于三种场景,分别是异步处理削峰填谷解耦合

异步处理

我们在使用消息队列的主要作用之一就是异步处理,当我们的业务主流程的某些逻辑不是主逻辑链路,或者操作比较耗时的逻辑,我们都可以通过消息队列进行异步处理,无需等待这些逻辑完成。

例如,当你的业务需要进行大量数据的导出,耗时比较长,则我们可以通过消息队列发送消息,交由消费者后续处理。或者,在请求链路中,我们也可以将次要的业务逻辑交由消息队列,等待消费者后续处理,从而提升系统整体的响应效率。

image.png

削峰填谷

秒杀场景可谓是老生常谈的业务场景,在秒杀场景下,短时间内会有大量的请求进入我们的系统,这个间隔可能是几秒到十几秒,然而这短短的时间却很有可能会冲垮我们的服务器。

为了应对这十几秒的瞬间写高峰,我们可以将秒杀请求暂存在消息队列中,然后业务服务器会响应用户类似于"秒杀结果结算中"等提示语,释放了系统资源之后再处理其它用户的请求。

将请求数据发送到消息队列后,我们可以通过在后台启动多个消费者来消费这些请求数据,执行特定的逻辑,由于消费者受限,只有有限个数的消费者在处理请求,因此最后落入数据库等组件的并发量也是有限的,从而防止大量请求冲垮我们的数据库。请求在消息队列中被短暂地堆积,当库存被消耗完之后,消息队列中堆积的请求就可以被丢弃了,用户也会得到秒杀失败的响应结果。

上述场景就是我们在使用消息队列中常见的作用场景之一:削峰填谷。通过削平短暂的流量高峰,减少对数据库等并发处理量不高的中间件的冲击。虽然消息会被短暂的堆积到消息队列中被延迟处理,但是我们可以时刻去监控消息队列的长度,若消息堆积量超过一定程度时,我们可以增加分区以及队列处理机来提升消息的处理能力。

我们在应对这类场景时,前期也需要你对请求量级、队列处理的时间、前端写入流量的大小、数据库处理能力做一个评估与测试,方便在应对流量峰值时,确定部署多少台机器处理这些大量的请求。

image.png

解耦合

消息队列也可以用于服务之间的解耦,例如当我们的一些业务操作,需要进行数据统计、数据上报等操作时,我们可能会通过HTTP或者PRC请求调用下游提供好的接口,我们在执行完业务操作后,同步将数据发送给下游服务,但这样的同步调用可能会导致一些问题,系统的耦合性比较强,例如,如果下游服务做了修改,那我们的接口在调用时也需要进行同步的修改,比较的麻烦,或者服务发送故障,那么会影响到我们接口的请求响应,影响系统可用性。

这是我们可以通过消息队列来解决耦合的问题,当我们需要进行数据上报等业务操作时,我们可以将数据推送到消息队列,然后下游服务来订阅这个消息队列对应的Topic并获取数据进行处理,这样下游服务就可以完成数据的上报,此时当下游服务发生变更或者故障时,也不会影响到我们的系统。

image.png

总结

消息队列是我们日常开发过程中常用的三大中间件之一,异步处理、解耦合和削峰填谷是消息队列在系统设计中起到的主要作用。

  • 异步处理可以简化业务流程的步骤,提升系统性能。
  • 削峰填谷可以削去短期内的峰值流量,减少系统压力,平缓的度过大流量请求。
  • 解耦合可以将系统与其他下游服务解耦开,从而达到互不影响的效果。