热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何设计一个牛逼的消息队列?

大家好,我是【架构摆渡人】,一只十年的程序猿。这是消息队列的第一篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友。通过前面文章的学习,我们对

大家好,我是【架构摆渡人】,一只十年的程序猿。这是消息队列的第一篇文章,这个系列会给大家分享很多在实际工作中有用的经验,如果有收获,还请分享给更多的朋友。

通过前面文章的学习,我们对消息队列的作用以及目前主流的一些消息队列中间件有了更深刻的了解。但是那些优秀的中间件都是别人写出来的,如果你在面试的时候,面试官问你:如果让你去设计一个消息队列,你打算怎么做?如果你对消息队列了解的不彻底,那么很有可能被这个问题问懵掉,最后支支吾吾的说不知道。


服务端

我们从日常使用消息队列来入手,看设计一个消息队列到底要有哪些关键的点。当你要用消息队列的时候首先肯定是下载部署包,然后部署在服务器上。部署的这个程序我们就理解它是消息队列的服务端程序。在其他消息队列里面都有一个固定的名称:Broker


那么为什么需要Broker呢?

你的消息要发送出去,必然得有接收方,这个接收方就是Broker。Broker收到消息后不是直接转给消费方,而是要先落盘,存储起来。这样才能保证消息不丢失,不影响业务。同时还有一些其他的业务操作,比如消息的查询。


存储

既然说到存储,我们做业务的时候,都会用三方存储,也就是数据库,比如Mysql。但是MQ的存储,基本上都不会用三方存储,而是直接采用写磁盘的方式,也就是自己要设计要存储格式,自己写,自己解析等等一系列操作。

当然,也不是说不能用三方存储去实现,下篇文章我们再给大家讲讲如何用数据库做消息队列的存储。用数据库做存储其实也就是利用已有的实现来解决复杂度,涉及到底层存储这块,而且还要考虑高性能,其实对技术要求很高的。

像RocketMQ中的存储就涉及到CommitLog,ConsumeQueue,IndexFile等概念。最重要的是磁盘操作我们都知道很慢,而我们经常用的Mysql为了提高性能也是有一套很复杂的设计,比如redo log,buffer pool等,所以如果直接用数据库做存储,是不是相当于站在巨人的肩上去摘果实呢!


主从

我们设计了一个Broker,使用过程中万一这个Broker挂掉了怎么办?这里是不是得考虑下高可用性,所以Broker还需要有主从的设计。

主节点的数据会同步给从节点,主节点出问题后,从节点可以顶上来提供服务,同时从节点也可以提供读的操作,为主节点减轻压力。


分片

一个Broker是部署在某一台服务器上面,这个服务的磁盘存储空间是有限制的,不可能无限扩容。所以当消息量很大的时候,如果只是一直往机器的本地磁盘写数据,最终会写不进去的。

在设计的时候还要考虑数据分片的场景,一个Topic的数据可以分成很多份进行存储,分别存储在不同的Broker上,这样当磁盘不够的时候,可以通过增加Broker的节点来扩容。

那么问题来了,客户端写入的时候怎么知道这个Topic有哪些分片的存储信息,怎么知道有哪些Broker是在线的呢?这就要引入另一个设计:注册中心,在RocketMq中叫NameServer。


注册中心

NameServer叫注册中心或者路由中心都可以,本质上都一样。Broker启动的时候需要将自身的信息告诉NameServer,同时也要保持一个心跳检查,这样NameServer才能知道Broker当前是否处于正常状态。

NameServer也要支持水平扩展,这样才能保证高可用性。既然要支持水平扩展,那么必然得无状态才行,但是NameServer本身就会存储一些数据,比如Broker信息。

这里有几个实现方式:

Broker启动的时候轮流向所有的NameServer进行注册,这样每个NameServer中都有全量的信息,即使某个节点挂了也不影响。RocketMQ就是使用的这种方式。

Broker启动的时候只向某一台NameServer进行注册,立马返回,然后NameServer之间再进行相互同步,Eureka就是使用的这种方式。

Broker启动的时候只向某一台NameServer进行注册,NameServer会同步向其他的NameServer进行数据的同步操作,等待所有写入成功或者半数写入成功,然后再返回给客户端。Zookeeper就是使用的这种方式。


SDK

服务端有了,还有一个必须要有的设计就是SDK了。应用程序通过依赖SDK就可以直接发送消息和消费消息。SDK同时可以考虑支持多语言,这样使用场景更广泛。

SDK主要是用来跟Broker通信的,所以对于网络通信我们也要选择一个合适的框架,比如Netty就非常合适,你要是觉得太难,直接用Http协议也可以,或者直接支持多协议,这些都是需要考虑的场景。


后台管理

后台管理可以实现很多治理的工作,方便我们在使用消息队列的时候去排查各种问题。

核心功能点:



  • 当前集群状态的查看

  • 消息的查询

  • 消息的消费轨迹查询

  • 消息的重复投递

  • 消息生产的监控大盘

  • 消息消费的监控大盘

  • SDK消费线程数的动态调整

  • 等等


总结

本文只是简单的给大家介绍了下设计一个消息队列需要做哪些核心的工作,看起来就几个点而已。但是这几个点你要真正的去写代码实现难度是很大的。当然,我们其实也没必要自己去造轮子,因为你造了也不一定能比目前主流在用的好,但是整体的架构我们还是要了解的,至于细节就看自己需不需要深入了解了。比如消息存储那块,存储格式是怎样的?顺序写如何实现的?mmap技术如何应用的等等。

原创:架构摆渡人(公众号ID:jiagoubaiduren),欢迎分享,转载请保留出处。

 

转 https://www.cnblogs.com/jiagoubaiduren/p/16213891.html



推荐阅读
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • RabbitMQ的消息持久化处理
    1、RabbitMQ的消息持久化处理,消息的可靠性是RabbitMQ的一大特色,那么RabbitMQ是如何保证消息可靠性的呢——消息持久化。2、auto ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了使用数据库管理员用户执行onstat -l命令来监控GBase8s数据库的物理日志和逻辑日志的使用情况,并强调了对已使用的逻辑日志是否及时备份的重要性。同时提供了监控方法和注意事项。 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • ZooKeeper 学习
    前言相信大家对ZooKeeper应该不算陌生。但是你真的了解ZooKeeper是个什么东西吗?如果别人面试官让你给他讲讲ZooKeeper是个什么东西, ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
author-avatar
欧泊王_121
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有