【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的高可靠消息服务设计实现

news2024/9/23 15:32:56

盘点本年度探索对外服务的百万请求量的高可靠消息服务设计实现

  • 前提回顾
  • 消息服务
    • 逻辑架构
      • 运作流程
      • 消息路由系统
      • 数据存储系统
        • BitCask结构
        • 异地存储容灾
      • 推送系统
      • 数据消费模式
        • 推、拉模式的切换
      • 实现低延时推送
      • 快速确认消息
        • 三层存储结构
          • HeapMemory
          • DirectMemory
  • 总结和展望

前提回顾

在深入研究了 “【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现” 设计实现后,我们意识到,尽管API网关为服务商提供了高效的数据获取手段,但实时数据的获取仍然是一个亟待解决的问题。

目前,轮询作为一种常见的解决方案,其效率却不尽如人意,且易导致机器资源的过度消耗。轮询的实时性受限于应用所设定的轮询间隔时间,这意味着数据的更新频率无法超越这一设限。因此,为了实现更高效、更实时的数据获取,服务商急需探索并应用更为先进和高效的数据获取策略。

消息服务

针对上述应用场景,开放平台推出了一项创新的消息服务技术。该技术的主要目标是构建一个实时、可靠且异步的双向数据交换通道,从而显著提升API的调用效率,使数据流通更加迅速和高效。目前,该系统已具备处理上亿级消息量的能力,同时能够轻松应对从十万到百万级的流量波动。

逻辑架构

消息系统在逻辑架构上主要由三个子系统构成:路由系统、存储系统以及推送系统。这三个子系统协同工作,确保消息数据的稳定传输。
在这里插入图片描述

  • 路由系统:路由系统负责接收和处理所有传入的消息,并将其正确地路由到目标系统或接收者。它可能包括负载均衡和消息分发机制,以保证消息的高效处理和传递。

  • 存储系统:存储系统负责消息的持久化存储和管理。它可以使用数据库或分布式存储系统来存储消息,并提供对消息的检索、查询和删除等功能。存储系统通常还与路由系统和推送系统进行数据交互,以确保消息的完整性和一致性。

  • 推送系统:推送系统用于将消息及时地推送给目标接收者。它可以通过不同的通信协议(如HTTP、WebSocket、TCP/IP等)将消息传递给终端设备或服务。推送系统可能还包括推送队列、消息处理和推送策略等功能,以确保消息的可靠传递和接收。
    在这里插入图片描述

运作流程

消息数据首先会被存储在系统中,然后再进行推送,这样的设计保证了每条消息至少能够被成功推送一次。

此外,写入操作与推送操作是相互分离的,发送方在发送消息后无需同步等待接收方的应答。这种异步通信方式使得客户端的任何异常都不会对发送方系统的稳定性造成影响。
在这里插入图片描述

消息路由系统

消息路由系统经过精心设计,采用了模块化的管道化处理流程,从而具备了出色的扩展性。该系统能够实时监听上游服务发生的各类事件,如新增数据、数据更新、状态改变等。

针对不同类型的业务,路由系统会执行相应的消息过滤、鉴权、格式转换、存储及日志记录等操作。
在这里插入图片描述
消息处理的全过程中,系统会详细记录每个处理环节的状态信息,并通过日志采集器将这些信息输出给日志审计系统。我们可以处理并分析这些日志数据,同时记录消息的完整轨迹,确保每一条消息都能够被准确追踪和回溯。

数据存储系统

存储系统作为整个架构的关键组件,主要负责削峰填谷,确保系统在高并发场景下依然能够稳定运行

该系统采用BitCask存储结构,结合内存映射文件技术,使得磁盘写入操作完全按照顺序进行,从而极大提升了写入速度。在数据读取方面,存储系统则运用了FileRegion零拷贝技术,有效减少了内存拷贝的开销,进一步提升了数据读取的效率。

在这里插入图片描述

BitCask结构

BitCask是一个基于哈希表结构的键值存储系统,它采用Append-only的方式进行数据写入,即所有的写操作只追加不修改老的数据。BitCask的数据文件以日志型只增不减的方式写入,每个文件有一定的大小限制,当文件增加到相应大小时,会产生一个新文件,而老的文件则只读不写。这种设计使得BitCask具有优秀的写入性能。

异地存储容灾

为了确保数据的安全性和可用性,存储系统被部署在多个机房中,这样的部署策略不仅提高了系统的容灾能力,还能在一定程度上实现数据的备份和冗余。这样的设计使得存储系统既能够满足高性能的需求,又能够确保数据的安全可靠。

推送系统

  • 技术选项:基于Disruptor构建了一个高效的事件驱动模型,并采用Netty作为网络层框架,旨在构建能够处理海量连接的模型。

  • 控制流量:系统能够根据连接吞吐量进行自适应调整,有效减轻慢连接对系统造成的压力。同时,利用WebSocket技术构建了长连接通道,进一步降低了通信延迟。

  • 优化性能,采用了对象池技术,显著降低了系统的垃圾回收(GC)频率,提高了整体运行效率。

从消息的触发到拉取、发送和确认,整个流程均实现了完全异步处理,确保了系统的高性能表现。
在这里插入图片描述
这些改进措施共同提升了系统的稳定性和可扩展性,使其能够更好地应对各种复杂场景。

数据消费模式

在消息系统中,消费模式通常包括服务端推送和客户端拉取两种。考虑到系统主要服务于公网环境,选择了推送模式,其优势如下:

  • 高实时性:从消息生成到实际推送至客户端,整体平均延迟仅为100毫秒,且最大延迟不会超过200毫秒。这种快速的响应能力确保了消息的时效性和准确性。

  • 减轻服务器压力:与拉取模式相比,推送模式每次都有实际数据发送,避免了因空轮询而产生的资源浪费。这有助于提升服务器的整体性能和稳定性。

  • 使用便捷性:在拉取模式下,客户端需要负责维护消费队列的位置,并处理多客户端并发消费时的复杂问题。而在推送模式下,这些繁琐的任务全部由服务器承担,客户端仅需启动SDK并监听消息即可。这种简化的操作流程降低了使用门槛,使得用户能够更轻松地使用系统。

推、拉模式的切换

系统同样支持客户端拉取模式。在这种模式下,推送系统会智能地将客户端的拉取请求转换为推送请求,并直接返回响应。推送服务器会根据客户端的请求,主动将相关数据推送给客户端。

通过这种方式,实现了拉取操作的异步化,从而有效降低了客户端的网络消耗。只有当客户端有新数据产生时,服务器才会返回数据;否则,不会返回任何数据,避免了不必要的网络传输。这样的设计不仅提升了系统的效率,也优化了客户端的用户体验。

实现低延时推送

在分布式消息系统中,推送模式的实时性至关重要,其核心指标便是推送延时。考虑到系统中各个长连接可能分布于不同的推送机器上,当新消息产生时,如何确保这些连接所在的机器能够迅速感知到这一事件变得尤为关键。

为了实现这一目标,设计了一套高效的事件通知机制。
在这里插入图片描述
在本系统中,所有的推送机器都通过彼此之间的连接构成了一个紧密的通知网络。当其中任意一台机器感知到新消息产生的事件时,它会迅速确定这条消息所归属的长连接所在的推送机器,并将消息快速传递给那台机器。随后,负责该长连接的推送机器会立即将数据推送给相应的客户端。

同时,路由系统在接收到每一条消息时,都会及时通知下游的推送系统。这种上下游系统之间的紧密协作确保了消息能够在产生后的第一时间被准确地推送给目标客户端,实现了消息的高效、实时传递。

过这种方式,各个推送机器能够在消息产生后迅速感知到相关事件,并及时进行消息推送,从而确保了推送模式的实时性和高效性。同时,这种机制也有效降低了网络传输的负担,因为只有在真正需要推送消息时,才会进行数据的传输。

快速确认消息

针对消息推送事务数据的特性,即大部分数据在几秒内完成一次读写操作后即失去意义,使用传统数据库进行存储显然并不合理。这类似于在数据库中插入一条几乎不会被读取的数据,不仅造成了资源的浪费,还可能导致数据库成为系统的瓶颈。

三层存储结构

针对消息推送的高频和短生命周期特性,本系统精心设计了存储子系统,采用HeapMemory、DirectMemory和FileSystem三级存储结构。为了确保存储系统的高效运行,我们对内存使用进行了精细化的管理。
在这里插入图片描述

HeapMemory

HeapMemory主要用于存储最近10秒内的发送记录,以便快速访问和处理。而其余的数据则会被异步写入内存映射文件,并最终持久化到磁盘中。

在HeapMemory中,我们基于时间维度将其划分为三个HashMap,通过时钟滴答机制实现无锁切换,从而确保数据的高效读写。

DirectMemory

在DirectMemory中,我们结合消息队列和时间维度,将数据组织成多个链表环。最新数据总是被写入到指针头链表,而末端指针则指向已经超时的事务所在链表。这种设计不仅有效隔离了各个队列之间的相互影响,还便于我们快速扫描和处理超时事务。

通过这种优化的存储模式,我们发现95%的消息事务都能在HeapMemory内完成,仅有5%的消息需要进入DirectMemory进行处理。至于涉及磁盘读写的消息事务更是寥寥无几。因此,绝大部分消息事务的处理都能在内存中高效完成,从而大幅节省了服务器资源。这也为我们的系统带来了更高的吞吐量和更低的延迟,提升了用户的整体体验。

总结和展望

到目前为止,我们已对消息队列高性能架构的基本设计实现和功能分布进行了全面而深入的介绍与分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1436538.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mybatis】从0学习Mybatis(2)

前言 本篇文章是从0学习Mybatis的第一篇文章,由于篇幅太长CSDN会限流,因此我打算分开两期来写,这是第二期!第一期在这儿:【Mybatis】从0学习Mybatis(1)-CSDN博客 1.什么是ResultMap结果映射&am…

力扣热门100题 - 5.最长回文子串

力扣热门100题 - 5.最长回文子串 题目描述:示例:提示:解题思路:(动态规划)代码: 题目链接:5. 最长回文子串 题目描述: 给你一个字符串 s,找到 s 中最长的回…

Python爬虫requests库详解

使用 requests 上一节中,我们了解了 urllib 的基本用法,但是其中确实有不方便的地方,比如处理网页验证和 Cookies 时,需要写 Opener 和 Handler 来处理。为了更加方便地实现这些操作,就有了更为强大的库 requests&…

「HarmonyOS」CustomDialogController自定义弹窗使用方法

需求背景: 在开发的过程中,总会遇到一些功能需要使用到弹窗进行信息的输入和修改,如用户个人信息的修改;在UI设计上每个App通常都会有各自的样式,而不是使用系统的标准样式,所以通常我们需要进行自定义弹窗…

TryHackMe-Net Sec Challenge练习

本文相关的TryHackMe实验房间链接:TryHackMe | Why Subscribe nmap nmap -T5 -p- 10.10.90.32 -T5 扫描速度 -p- 全端口扫描 答题: 这题叫我们找藏在http服务下的flag,根据上面扫出来的端口,所以我们开始搞80 这里简单介绍一下…

2.6 假期作业

分布编译 -ESc iso 1.预处理:头文件展开,宏替换,删除注释,不会查找语法错误 例:gcc -E 1.c -o 1.i 2.编译:生成汇编文件,会查找语法错误 例:gcc -S 1.i -o 1.s 3.汇编:生成二…

亚马逊认证考试系列 - 知识点 - LightSail介绍

一、引言 在当今云计算的时代,亚马逊网络服务(AWS)已成为业界领先的云服务提供商。其中,LightSail服务是AWS为简化云计算的入门和使用而推出的一项服务。它特别适合那些想要快速搭建网站、开发环境或小型应用的用户。通过LightSa…

代码随想录算法训练营第二八天 | 分割 子集

目录 复原IP地址子集子集 II LeetCode 93.复原IP地址 LeetCode 78.子集 LeetCode 90.子集II 复原IP地址 一些字符串的基本操作不会 s.insert(i 1, ‘.’); s.deleteCharAt(i 1); class Solution {List<String> result new ArrayList<>();public List<St…

EMC测试介绍

EMC测试介绍 EMC包括电磁干扰(EMI) 和抗电磁干扰(EMS)两个部分。发射干扰传导发射测试极限线以峰值检坡器测量时使用的决策树应用EN55022标准的波形示例测试仪器![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4580f693ae9a4f84891ece29681c7bf2.png) 辐射发射测试…

【Iceberg学习二】Branch和Tag在Iceberg中的应用

Iceberg 表元数据保持一个快照日志&#xff0c;记录了对表所做的更改。快照在 Iceberg 中至关重要&#xff0c;因为它们是读者隔离和时间旅行查询的基础。为了控制元数据大小和存储成本&#xff0c;Iceberg 提供了快照生命周期管理程序&#xff0c;如 expire_snapshots&#xf…

c语言--指针的传值调用和传址调用

目录 一、前言二、传值调用。三、传址调用四、总结 一、前言 学习指针的目的是使用指针解决问题&#xff0c;那什么问题&#xff0c;非指针不可呢&#xff1f; 二、传值调用。 写个函数&#xff0c;交换两个整数的内容。 #include<stdio.h> void Swap1(int x, int y)…

【halcon】write_image 图片保存

前言 write_image 是一个可以用来保存图片的算子&#xff0c;可以将Image对象保存成各种格式的图片。还可以对图片进行压缩。 正文 参数&#xff1a; Image&#xff08;输入对象&#xff09;&#xff1a; 输入图像或输入图像的数组。支持的像素类型包括byte、direction、cy…

opencv c++ (6):直方图

1. 绘制直方图 api不在做详细介绍&#xff0c;具体看以下代码例子 #include <iostream> #include<opencv.hpp> #include<opencv2\highgui\highgui.hpp>using namespace std; using namespace cv;int main() {Mat src imread("src.jpg");if (src…

Qt 常见容器类用法(二)

目录 QList类 QLinkedList类 QList类 对于不同的数据类型&#xff0c;QList<T>采取不同的存储策略&#xff0c;存储策略如下&#xff1a; 如果T是一个指针类型或指针大小的基本数据类型(该基本类型占有的字节数和指针类型占有的字节数相同)&#xff0c;QList<T>…

python 爬虫安装http请求库

我的是window环境&#xff0c;安装的python3&#xff0c;如果再linux环境&#xff1a;pip install requests 开始&#xff1a; 上面我们成功发送请求并获取到响应&#xff0c;现在需要解析html或xml获取数据&#xff0c;因此我使用现成的工具库Beautiful Soup

期末账项调整

目录 一. 概念二. 期末账项调整的种类及应用三. 基本调整事项3.1 应计项目3.2 递延项目 四. 估计项目的调整 \quad 一. 概念 \quad 在会计期末对一些没有明显经济业务发生(没有原始凭证)&#xff0c;但按照权责发生制要求&#xff0c;却影响本会计期间收益的一些隐含事项进行调…

windows+vscode配置远程Linux开发环境

1.Linux运行sshd服务 安装openssh-server sudo apt install openssh-server 开启服务 sudo service ssh start 检查sshd是否开启 sudo ps -aux | grep sshd 2.vscode上安装RemoteDevelopment插件 其他依赖性会自动安装 3.配置远程Linux主机信息 Linux主机ip 4.在vscode…

必看!第六版CCF(中国计算机学会)推荐B类国际学术会议!

中国计算机学会 中国计算机学会&#xff08;CCF&#xff09;是全国性、学术性、非营利的学术团体&#xff0c;由从事计算机及相关科学技术领域的个人和单位自愿组成。作为独立社团法人&#xff0c;CCF是中国科学技术协会的成员之一&#xff0c;是全国一级学会&#xff01; CCF的…

CTF-show WEB入门--web19

今晚web19也就顺便解决了 老样子我们先打开题目看看题目提示&#xff1a; 可以看到题目提示为&#xff1a; 密钥什么的&#xff0c;就不要放在前端了 然后我们打开题目链接&#xff1a; 然后我们查看网页源代码&#xff1a; 可以发现有用的内容全在网页源代码里。 前端验证…

NLP_词的向量表示Word2Vec 和 Embedding

文章目录 词向量Word2Vec&#xff1a;CBOW模型和Skip-Gram模型通过nn.Embedding来实现词嵌入Word2Vec小结 词向量 下面这张图就形象地呈现了词向量的内涵:把词转化为向量&#xff0c;从而捕捉词与词之间的语义和句法关系&#xff0c;使得具有相似含义或相关性的词语在向量空间…