消息队列|青训营笔记

68 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第13天,今天学习了主要消息队列,下面是我的笔记。

消息队列

1、应用场景

消息队列有很多使用场景,比较常见的有3个:解耦、异步、削峰。

  • 解耦:传统的软件开发模式,各个模块之间相互调用,数据共享,每个模块都要时刻关注其他模块的是否更改或者是否挂掉等等,使用消息队列,可以避免模块之间直接调用,将所需共享的数据放在消息队列中,对于新增业务模块,只要对该类消息感兴趣,即可订阅该类消息,对原有系统和业务没有任何影响,降低了系统各个模块的耦合度,提高了系统的可扩展性。

  • 异步:消息队列提供了异步处理机制,在很多时候应用不想也不需要立即处理消息,允许应用把一些消息放入消息中间件中,并不立即处理它,在之后需要的时候再慢慢处理。

  • 削峰:在访问量骤增的场景下,需要保证应用系统的平稳性,使用消息队列能够使关键组件支撑突发访问压力,不会因为突发的超负荷请求而完全崩溃。消息队列的容量可以配置的很大,如果采用磁盘存储消息,则几乎等于“无限”容量,这样一来,高峰期的消息可以被积压起来,在随后的时间内进行平滑的处理完成,而不至于让系统短时间内无法承载而导致崩溃。

2、Kafka

2.1、使用场景

  • kafka使用场景,业务日志、用户行为数据、Metrics数据

2.2、具体使用

  • 创建集群

  • 新增topic

  • 编写生产者逻辑

    img

整个 Kafka 体系结构中引入了以下 3 个术语。

  • Producer:生产者,也就是发送消息的一方。生产者负责创建消息,然后将其投递到 Kafka 中。

  • Consumer:消费者,也就是接收消息的一方。消费者连接到 Kafka 上并接收消息,进 而进行相应的业务逻辑处理。

  • Broker:服务代理节点。一个或多个 Broker 组成了一个 Kafka 集群

3、BMQ

  • 兼容kafka协议的云原生消息队列

  • 与kafka对比

  • 具体操作KafkaBMQ
    重启数据复制,分钟级秒级,重启后直接对外服务
    替换数据替换,分钟级秒级,替换后直接对外服务
    扩容数据扩容,分钟级秒级,扩容后直接对外服务
    缩容数据缩容,分钟级秒级,缩容后直接对外服务

    4、RocketMQ

    nameserver.png

  1. 启动NameServer,NameServer启动后开始监听端口,等待Broker,Producer,Consumer连接。
  2. Broker与所有NameServer长连接,每三十秒发送心跳包。
  3. 发送消息之前,可以先创建topic
  4. Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer获取路由信息。根据算法策略选择一个queue,与队列所在的broker建立长连接向broker发送消息。(当然在这之前会执行缓存。)
  5. Consumer和Producer类似,但是多一个发送心跳,producer和consumer都会执行30s的路由更新操作。
  • RocketMQ相比于Kafka,更适合于业务操作。