首页 > 其他分享 >想设计一个高并发的消息中间件前,先熟悉一下这些知识点

想设计一个高并发的消息中间件前,先熟悉一下这些知识点

时间:2024-02-17 10:11:43浏览次数:22  
标签:知识点 存储 需要 并发 消息 消息中间件 磁盘 数据

本文分享自华为云社区《面试必问 | 如何设计一款高并发的消息中间件?》,作者:冰 河。

消息中间件涉及的知识点

要想设计一个具有高并发的消息中间件,那么首先就要了解下消息中间件涉及哪些具体的知识点。通常,设计一个良好的消息中间件最少需要满足如下条件:

  • 生产者、消费者模型。
  • 支持分布式架构。
  • 数据的高可用。
  • 消息数据不丢失。

接下来,我们就针对消息中间件来分别谈谈这些技术点。

生产者消费者模型

相信很多小伙伴对于生产者和消费者模型都比较了解了,简单的说:就是消息中间件能够使其他应用来生产消息,也能够使其他应用来消费相应的消息。

对于生产者和消费者模型,我们需要考虑的问题点就比较多了。接下来,我就一步步来引导大家进行思考。

首先,我们来思考这样一个问题:如果生产者生产了消息,那么消息中间件应该怎样存储相应的数据呢?存储在内存? 存储在磁盘?还是同时存储在内存和磁盘中呢?

如果是将消息数据同时存储在内存和磁盘中,我们又该如何处理这些数据呢?是生产者将消息投递到消息中间件之后,我们就立刻将数据写入磁盘?还是说数据先驻留到内存,然后每隔一段时间刷到磁盘上?

如果是每隔一段时间刷到磁盘上,那我们又要考虑磁盘文件的切分问题,也就是说,需要将消息数据分成多少个磁盘文件?(总不能把所有的数据放到一个磁盘文件中吧)。如果是需要切分成多个磁盘文件,那切分的规则又是什么呢?

上面这些问题都是我们在设计一个消息中间件时需要考虑的问题。然而,这还只是一小部分问题。如果想在面试时脱颖而出,那就还需要继续往下看,还有一些重要的问题点需要注意。

如果文件按照一定的规则切分到多个磁盘文件中了,那是不是还需要管理元数据来标识数据的具体消息(就像是Hadoop中的NameNode节点中存储着DataNode的元数据信息,NameNode节点通过这些元数据信息就能够更好的管理DataNode节点)?

这些元数据可以包括:消息数据的偏移量、也可以是消息数据的唯一ID。

考虑完数据的存储问题,我们还需要考虑的是:消息中间件是如何将数据投递到对应的消费者的?

在设计生产者和消费者时,还一个很重要的问题需要我们考虑:我们在设计消息中间件时,采用的消费模式是什么?会不会将数据均匀的分配给消费者?还是会通过一些其他的规则将数据投递到消费者?

支持分布式架构

如果我们设计的消息中间件,每天会承载TB级别的数据高并发和高吞吐量的写入操作。这里,我们就需要考虑将消息中间件设计成分布式架构。

在设计分布式架构时,我们还需要考虑将存储的比较大的数据,做成分片存储,对数据进行分片等操作。

除了这些,我们还需要考虑另外一个核心问题:对于消息中间件来说,需要支持自动扩容操作。

还有就是是否支持数据分片,如何实现数据分片的扩容和自动数据负载均衡迁移等。

数据的高可用

一般互联网应用的高可用,是通过本地堆内存,分布式缓存,和一份数据在不同的服务器上都搞一个副本来实现的。此时,任何一个存储节点宕机,都不会影响整体的高可用。我们在设计消息中间件时也可以参考这个思路。

消息数据不丢失

此时,我们就需要提供手动ACK的机制,也就是说:当消费者真正消费消息完毕后,向消息中间件返回“ 处理完成” 的标识,消息中间件删除相应的已处理的消息。

但是,细化的话,这里,我们就需要两套ACK机制:

  • 一种ACK对应的是生产端。如果一直没有接收到ACK消息,则需要通过生产者来重新发送一条消息来保证生产消息成功。
  • 另一种ACK对应的是消费端。一旦一条消息消费并处理成功,必须返回一个ack给消息中间件,然后消息中间件才能删除这条消息。否则一旦消费者宕机,就必须重发这条消息给其他的消费者实例,保证消息一定会被处理成功。

点击关注,第一时间了解华为云新鲜技术~

 

标签:知识点,存储,需要,并发,消息,消息中间件,磁盘,数据
From: https://www.cnblogs.com/huaweiyun/p/18017741

相关文章

  • 《程序是怎样跑起来的》第四五章知识点
    《让程序跑起来》第四五章知识点第四章:程序的内存管理内存的基本概念:介绍计算机内存的基本结构,包括RAM(随机存取存储器)的工作原理,以及内存与CPU之间的交互方式。程序的加载与执行:解释操作系统如何将程序从磁盘加载到内存中,以及CPU如何执行内存中的指令。堆与栈:介绍程序运行时的......
  • 《程序是怎样跑起来的》第六七章知识点
    第六章:程序的优化与调试性能优化:讨论如何优化程序的性能,包括减少不必要的计算、使用更高效的算法、优化数据结构等。代码调试:介绍常见的代码调试技术,如使用调试器(debugger)来跟踪程序的执行过程、设置断点、查看变量值等。错误处理与异常捕获:讲解如何编写健壮的代码,包括错误处理......
  • flutter 知识点
    前沿熟悉了下flutter,然后把一些知识点梳理下,便于记忆:其实很多布局样式和CSS差异并不大,我的理解flutter的写法就是HTML写在标签上的style,也就是内敛样式,这样好理解,你也可以有不同的看法, 完成了之前没有完成的flutterdemo哈哈哈,OK 常用的布局和用到的组件:其他可以去......
  • 前端知识点学习汇总,温故而知新
    前端知识点学习汇总,温故而知新1.CSS行内样式表:权重高,div2.内部样式表,写在headerstyle里:结构+样式选择器{属性1:属性值1;属性2:属性值2}3.外部样式表:style.css,将结构和样式分开<head><linkrel="stylesheet"href="css/style.css"></head>样式表优点缺点控制范......
  • .NET 团队公布.NET 9开发目标 并发布.NET9的首个预览版
    在一篇博文中我们对.NET9的愿景[1]:.NET团队概述了.NET9的开发目标和最终愿景,涵盖两大重点领域:云原生和智能应用程序开发。它在继.NET8之后,继续强化对云原生应用和性能的支持。.NET9预览版1已经在2024年2月13日发布,与往常一样,.NET9将在整个平台上提供性能、生产力、安全......
  • 第二十二天:mysql并发控制及事务日志
    一、锁机制锁类型:读锁:共享锁,也称为S锁,只读不可写(包括当前事务),多个读互不阻塞写锁:独占锁,排它锁,也称为X锁,写锁会阻塞其它事务(不包括当前事务)的读和写S锁和S锁是兼容的,X锁和其它锁都不兼容,举个例子,事务T1获取了一个行r1的S锁,另外事务T2可以立即获......
  • JAVA并发之PriorityBlockingQueue
    PriorityBlockingQueue(优先阻塞队列)是Java并发包java.util.concurrent下面的一个工具类,它除了具有阻塞队列的功能外还具有以下特点:对队列中的元素进行排序,如果未指定比较器,插入队列的元素必须实现Comparable接口内部基于数组实现的最小二叉堆算法队列的长度是可扩展的(类似Ar......
  • 【Java 并发】【队列应用】【二】Tomcat的NioEndPoint中ConcurrentLinkedQueue 的使用
    1 前言这一节我们讲解Tomcat的NioEndPoint中ConcurrentLinkedQueue的使用。2  Tomcat的容器结构本节讲解apache-tomcat-7.0.32-src源码中ConcurrentLinkedQueue的使用。首先介绍Tomcat的容器结构以及NioEndPoint的作用,以便后面能够更加平滑地切入话题,如图11-4所示......
  • 【Java 并发】【队列应用】【一】ArrayBlockingQueue 的使用-Logback异步日志打印
    1 前言看了那么多Java提供的队列工具,那么我们这节开始看看哪些地方用到了这些队列哈。这一节我们讲解logback异步日志打印中ArrayBlockingQueue的使用。2  异步日志打印模型概述在高并发、高流量并且响应时间要求比较小的系统中同步打印日志已经满足不了需求了,这是因为......
  • 【Java 并发】【十】【JUC数据结构】【十】PriorityBlockingQueue 原理
    1 前言这节我们继续看看另一个队列 PriorityBlockingQueue,优先级的哈。2 PriorityBlockingQueue介绍PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素。其内部是使用平衡二叉树堆实现的,所以直接遍历队列元素不保证有序。默认使......