干货 | 携程基于BookKeeper的延迟消息架构落地实践

RocketMq和QMQ 文章目录rocketMq物理部署结构逻辑部署结构持久化方式存储介质消息的存储和发送1. 消息存储2. 消息发送文件系统数据存储结构CommitLogConsumeQueueIndexFile消费模式1. 集群模式2. 广播模式负载均衡发送负载均衡订阅消息负载均衡集群模式广播模式刷盘模式异步刷盘同步刷盘高可用机制消息发送高可用消息消费高可用主从复制同步复制异步复制高可用总结Pull/Push消费事务消息事务消息的发送事务补偿事务消息的状态例子使用限制顺序消息QMQQMQ的消息存储模型事务实现持久化方式 roc 阅读详情

作者简介

 

本文作者magiccao、littleorca,来自携程消息队列团队。目前主要从事消息中间件的开发与弹性架构演进工作,同时对网络/性能优化、应用监控与云原生等领域保持关注。

一、背景

QMQ延迟消息是以服务形式独立存在的一套不局限于消息厂商实现的解决方案,其架构如下图所示。

cb4b4ec4f6d5f4d71978a5888395a809.png

QMQ延迟消息服务架构

延迟消息从生产者投递至延迟服务后,堆积在服务器本地磁盘中。当延迟消息调度时间过期后,延迟服务转发至实时Broker供消费方消费。延迟服务采用主从架构,其中,Zone表示一个可用区(一般可以理解成一个IDC),为了保证单可用区故障后,历史投递的待调度消息正常调度,master和slave会跨可用区部署。

1.1 痛点

此架构主要存在如下几点问题:

a)服务具有状态,无法弹性扩缩容;

b)主节点故障后,需要主从切换(自动或手动);

c)缺少一致性协调器保障数据的一致性。

如果将消息的业务层和存储层分离出来,各自演进协同发展,各自专注在擅长的领域。这样,消息业务层可以做到无状态化,轻松完成容器化改造,具备弹性扩缩容能力;存储层引入分布式文件存储服务,由存储服务来保证高可用与数据一致性。


1.2 分布式文件存储选型

对于存储服务的选型,除了基本的高可用于数据一致性特点外,还有至关重要的一点:高容错与低运维成本特性。分布式系统最大的特点自然是对部分节点故障的容忍能力,毕竟任何硬件或软件故障是不可百分百避免的。因此,高容错与低运维成本将成为我们选型中最为看重的。

2016年由雅虎开源贡献给Apache的Pulsar,因其云原生、低延迟分布式消息队列与流式处理平台的标签,在开源社区引发轰动与追捧。在对其进行相关调研后,发现恰好Pulsar也是消息业务与存储分离的架构,而存储层则是另一个Apache开源基金会的BookKeeper。


二、BookKeeper

BookKeeper作为一款可伸缩、高容错、低延迟的分布式强一致存储服务已被部分公司应用于生产环境部署使用,最佳实践案例包括替代HDFS的namenode、Pulsar的消息存储与消费进度持久化以及对象存储。


2.1 基本架构

cd3946bde0d62cea92ba951f1b50ec4e.png

BookKeeper基本架构

Zookeeper集群用于存储节点发现与元信息存储,提供强一致性保证;

Bookie存储节点,提供数据的存储服务。写入和读取过程中,Bookie节点间彼此无须通信。Bookie启动时将自身注册到Zookeeper集群,暴露服务;

Client属于胖客户端类型,负责与Zookeeper集群和BookKeeper集群直接通信,且根据元信息完成多副本的写入,保证数据可重复读。


2.2 基本特性

a)基本概念

Entry:数据载体的基本单元

Ledger:entry集合的抽象,类似文件

Bookie:ledger集合的抽象,物理存储节点

Ensemble:ledger的bookie集合

b)数据读写

9e9ff123bb5165d81adbedb124ae7f6d.png

BookKeeper数据读写

bookie客户端通过创建而持有一个ledger后便可以进行entry写入操作,entry以带状方式分布在enemble的bookie中。entry在客户端进行编号,每条entry会根据设置的副本数(Qw)要求判定写入成功与否;

bookie客户端通过打开一个已创建的ledger进行entry读取操作,entry的读取顺序与写入保持一致,默认从第一个副本中读取,读取失败后顺序从下一个副本重试。

c)数据一致性

持有可写ledger的bookie客户端称为Writer,通过分布式锁机制确保一个ledger全局只有一个Writer,Writer的唯一性保证了数据写入一致性。Writer内存中维护一个LAC(Last Add Confirmed),当满足Qw要求后,更新LAC。LAC随下一次请求或定时持久化在bookie副本中,当ledger关闭时,持久化在Metadata Store(zookeeper或etcd)中;

持有可读ledger的bookie客户端称为Reader,一个ledger可以有任意多个Reader。LAC的强一致性保证了不同Reader看到统一的数据视图,亦可重复读,从而保证了数据读取一致性。

d)容错性

典型故障场景:Writer crash或restart、Bookie crash。

Writer故障,ledger可能未关闭,导致LAC未知。通过ledger recover机制,关闭ledger,修复LAC;

Bookie故障,entry写入失败。通过ensemble replace机制,更新一条新的entry路由信息到Metadata Store中,保障了新数据能及时成功写入。历史数据,通过bookie recover机制,满足Qw副本要求,夯实了历史数据读取的可靠性。至于副本所在的所有bookie节点全部故障场景,只能等待修复。

e)负载均衡

新扩容进集群的bookie,当创建新的ledger时,便自动均衡流量。


2.3 同城多中心容灾

上海区域(region)存在多个可用区(az,available zone),各可用两两间网络延迟低于2ms,此种网络架构下,多副本分散在不同的az间是一个可接受的高可用方案。BookKeeper基于Zone感知的ensemble替换策略便是应对此种场景的解决方案。

55b01a3cd1c7bb2a5148f50b2c6d87ee.png

基于Zone感知策略的同城多中心容灾

开启Zone感知策略有两个限制条件:a)E % Qw == 0;b)Qw > minNumOfZones。其中E表示ensemble大小,Qw表示副本数,minNumOfZones表示ensemble中的最小zone数目。

譬如下面的例子:

minNumOfZones = 2
desiredNumZones = 3
E = 6
Qw = 3
[z1, z2, z3, z1, z2, z3]

故障前,每条数据具有三副本,且分布在三个可用区中;当z1故障后,将以满足minNumOfZones限制生成新的ensemble:[z1, z2, z3, z1, z2, z3] -> [z3, z2, z3, z3, z2, z3]。显然对于三副本的每条数据仍将分布在两个可用区中,仍能容忍一个可用区故障。

DNSResolver

客户端在挑选bookie组成ensemble时,需要通过ip反解出对应的zone信息,需要用户实现解析器。考虑到zone与zone间网段是认为规划且不重合的,因此,我们落地时,简单的实现了一个可动态配置生效的子网解析器。示例给出的是ip精确匹配的实现方式。

public class ConfigurableDNSToSwitchMapping extends AbstractDNSToSwitchMapping {


    private final Map<String, String> mappings = Maps.newHashMap();


    public ConfigurableDNSToSwitchMapping() {
        super();
        mappings.put("192.168.0.1", "/z1/192.168.0.1"); // /zone/upgrade domain
        mappings.put("192.168.1.1", "/z2/192.168.1.1");
        mappings.put("192.168.2.1", "/z3/192.168.2.1");
    }


    @Override
    public boolean useHostName() {
        return false;
    }


    @Override
    public List<String> resolve(List<String> names) {
        List<String> rNames = Lists.newArrayList();
        names.forEach(name -> {
            String rName = mappings.getOrDefault(name, "/default-zone/default-upgradedomain");
            rNames.add(rName);
        });
        return rNames;
    }
}

可配置化DNS解析器示例

数据副本分布在单zone

当某些原因(譬如可用区故障演练)导致只有一个可用区可用时,新写入的数据的全部副本都将落在单可用区,当故障可用区恢复后,仍然有部分历史数据只存在于单可用区,不满足多可用区容灾的高可用需求。

AutoRecovery机制中有一个PlacementPolicy检测机制,但缺少恢复机制。于是我们打了个patch,支持动态机制开启和关闭此功能。这样,当可用区故障恢复后可以自动发现和修复数据全部副本分布在单可用区从而影响数据可用性的问题。

三、弹性架构落地

引入BookKeeper后,延迟消息服务的架构相对漂亮不少。消息业务层面和存储层面完全分离,延迟消息服务本身无状态化,可以轻易伸缩。当可用区故障后,不再需要主从切换。

1ae462d252dfeff2545cca758e3c3714.png

延迟消息服务新架构


3.1 无状态化改造

存储层分离出去后,业务层实现无状态化成为可能。要达成这一目标,还需解决一些问题。我们先看看BookKeeper使用上的一些约束:

1)BookKeeper不支持共享写入的,也即业务层多个节点如果都写数据,则各自写的必然是不同的ledger;

2)虽然BookKeeper允许多读,但多个应用节点各自读取的话,进度是相互独立的,应用必须自行解决进度协调问题。

上述两个主要问题,决定我们实现无状态和弹性扩缩容时,必需自行解决读写资源分配的问题。为此,我们引入了任务协调器。

我们首先将存储资源进行分片管理,每个分片上都支持读写操作,但同一时刻只能有一个业务层节点来读写。如果我们把分片看作资源,把业务层节点看作工作者,那么任务协调器的主要职责为:

1)在尽可能平均的前提下以粘滞优先的方式把资源分配给工作者;

2)监视资源和工作者的变化,如有增减,重新执行职责1;

3)在资源不够用时,根据具体策略配置,添加初始化新的资源。

由于是分布式环境,协调器自身完成上述职责时需要保证分布式一致性,当然还要满足可用性要求。我们选择了基于ZooKeeper进行选主的一主多从式架构。

e25a4b61f7acb2a2d2130a01df870cbc.png

如图所示,协调器对等部署在业务层应用节点中。运行时,协调器通过基于ZooKeeper的leader竞选机制决出leader节点,并由leader节点负责前述任务分配工作。

620dd1884bc97c6bc820374c4dc78d2e.png

协调器选举的实现参考ZooKeeper官方文档,这里不再赘述。


3.2 持久化数据

原有架构将延迟消息根据调度时间按每10分钟桶存储在本地,时间临近的桶加载到内存中,使用HashedWheelTimer来调度。该设计存在两个弊端:

  • 分桶较多(我们支持2年范围的延迟,理论分桶数量达10万多);

  • 单个桶的数据(10分钟)如不能全部加载到内存,则由于桶内未按调度时间排序,可能出现未加载的部分包含了调度时间较早的数据,等它被加载时已经滞后了。

弊端1的话,单机本地10万+文件还不算多大问题,但改造后这些桶信息以元信息的方式存储在ZooKeeper上,我们的实现方案决定了每个桶至少占用3个ZooKeeper节点。假设我们要部署5个集群,平均每个集群有10个分片,每个分片有10万个桶,那使用的ZooKeeper节点数量就是1500万起,这个量级是ZooKeeper难以承受的。

弊端2则无论新老架构,都是个潜在问题。一旦某个10分钟消息量多一些,就可能导致消息延迟。往内存加载时,应该有更细的颗粒度才好。

基于以上问题分析,我们参考多级时间轮调度的思路,略加变化,设计了一套基于滑动时间分桶的多级调度方案。

调度器名称

屏障(最小调度时间)

单桶大小

典型桶数量

L3w

T + 14 days

1 week

104

L2d

T + 2 days

1 day

14

L1h

T + 2 hours

1 hour

48

L0m

T + 0

1 minute

120

如上表所示,最大的桶是1周,其次是1天,1小时,1分钟。每个级别覆盖不同的时间范围,组合起来覆盖2年的时间范围理论上只需286个桶,相比原来的10万多个桶有了质的缩减。

同时,只有L0m这一级调度器需要加载数据到HashedWheelTimer,故而加载粒度细化到了1分钟,大大减少了因不能完整加载一个桶而导致的调度延迟。

多级调度器以类似串联的方式协同工作。

每一级调度器收到写入请求时,首先尝试委托给其上级(颗粒度更大)调度器处理。如果上级接受,则只需将上级的处理结果向下返回;如果上级不接受,再判断是否归属本级,是的话写入桶中,否则打回给下级。

每一级调度器都会将时间临近的桶打开并发送其中的数据到下一级调度器。比如L1h发现最小的桶到了预加载时间,则把该桶的数据读出并发送给L0m调度器,最终该小时的数据被转移到L0m并展开为(最多)60个分钟级的桶。

2e28962724c07f67d1cf7cddc5ab4917.png

四、未来规划

目前bookie集群部署在物理机上,集群新建、扩缩容相对比较麻烦,未来将考虑融入k8s体系;bookie的治理与平台化也是需要考虑的;我们目前只具备同城多中心容灾能力,跨region容灾以及公/私混合云容灾等高可用架构也需要进一步补强。

参考文档

QMQ开源地址:

https://github.com/qunarcorp/qmq

Pulsar官网:

https://pulsar.apache.org/

BookKeeper官网:

https://bookkeeper.apache.org/

为什么选择BookKeeper:

https://medium.com/streamnative/why-apache-bookkeeper-part-1-consistency-durability-availability-ac697a3cf7a1

【推荐阅读】

2c620f15ddb4e393034c75ed46571b1a.png

 “携程技术”公众号

  分享,交流,成长

Flavio Junqueira:Apache BookKeeper——高性能可靠预写式日志 为了高效的顺序写入,较好的容错性和可扩展性,设计了BookKeeper。它的结构由他们组成:Bookie(存储节点),Ledger(日志文档),Ensemble(用一组Bookie存储Ledger)。 立即下载

相关推荐

Linux下用SquareLine Studio开发LVGL界面:从安装到实战的完整避坑指南

本文提供了一份在Linux系统下使用SquareLine Studio开发LVGL图形界面的完整实战指南。内容涵盖从SDL库安装、SquareLine Studio环境配置、界面可视化设计,到工程导出、源码编译及常见错误排查的全流程。重点解析了如何将设计界面无缝集成到Linux开发流程中,并针对嵌入式设备移植提供了关键步骤,旨在帮助开发者高效避坑,快速上手LVGL界面开发。

egg99的博客 905

干货 | QMQ在携程的落地实践

作者简介Magiccao,携程软件开发工程师,热衷网络、操作系统相关技术。QMQ(Qunar Message Queue)诞生于去哪儿网,初版基于MySQL存储。随着集团业务系统越发倚...

携程技术 1591

cmu15445(2024fall) project 2

project 2比p1难度要更大,代码量更大且涉及的知识更多,实现中出现的bug更多,好在是最后全部解决了。我最大的收获在于对于多线程编程的理解更深入了,实际发现解决了多个多线程相关的bug,学会了更多多线程下debug的技巧方法,也见识了更多多线程的bug情况。在之后可以更系统的学习一下多线程编程。同时学会实现B+树也是需要掌握的基础。

Jerome_Yi的博客 1556

QMQ源码分析之delay-server篇【一】

前言 QMQ是一款去哪儿网内部使用多年的mq。不久前(大概1-2年前)已在携程投入生产大规模使用,年前这款mq也开源了出来。关于QMQ的相关设计文章可以看这里。在这里,我假设你已经对QMQ前世今生以及其设计和实现等背景知识已经有了一个较为全面的认识。 主要功能 对于delay-server,官方已经有了一些介绍。记住,官方通常是最卖力的那个"媒婆"。qmq-delay-server其实主要做的...

weixin_34235371的博客 666

【无人机智能避障】基于深度强化学习的城市复杂环境路径规划实战

本文探讨了基于深度强化学习的无人机在城市复杂环境中的智能避障与路径规划。针对传统算法难以应对动态与非结构化障碍的痛点,文章详细介绍了如何利用DQN算法,通过设计合理的状态空间、奖励函数,并结合经验回放、目标网络等技巧,训练无人机自主学会在楼宇间安全、高效飞行的策略。

weixin_28224217的博客 733

基于C++和Basler SDK的相机开发详解

Basler相机是德国Basler公司生产的高性能工业相机,具有高分辨率、高帧率和低噪声的特点。Basler相机广泛应用于机器视觉、工业自动化、医疗影像和安防监控等领域。高分辨率和高帧率:能够捕捉清晰、细腻的图像。多种接口:支持USB、GigE、Camera Link等多种接口,方便不同应用场景的需求。丰富的配置选项:支持多种图像格式、分辨率和帧率的配置,适应不同的应用需求。本文详细介绍了如何基于C++和Basler SDK进行相机开发,涵盖了从环境搭建、相机连接、图像采集到图像处理的完整过程。

qq_38334677的博客 2096

Pulsar

这两年 Pulsar 发展比较快,有好多大公司引入了 Pulsar,相关的资料和课程也多了,今天一起来了解一下 Pulsar 这款中间件。 下图是几款消息中间件的历史: 2012年 Pulsar 在 Yahoo 内部开发,2016 年开源并捐献给 Apache,2018 成为 Apache 顶级项目。 1. 架构 Pulsar 的架构图如下: 总结一下,Pulsar 有下面的几个特性。 1.1 计算存储分离 Pulsar 采用计算和存储相分离的架

qq_40995589的博客 1906

Open3D 计算点云的主曲率

本文介绍了点云主曲率计算的方法与实现。通过分析曲面局部几何形状的主曲率(最大和最小方向),基于法线构建投影矩阵和协方差矩阵,使用奇异值分解计算曲率。代码采用Open3D实现,包括点云加载、法线估计、邻域搜索和曲率映射可视化功能。系统支持交互式点云文件选择,将曲率值映射为色彩进行直观展示,为点云处理中的特征提取和分割任务提供基础几何特征。实现过程包含了法线去中心化、协方差矩阵构建和特征值归一化等关键步骤,完整展示了从理论到实践的曲率分析流程。

点云侠的博客 543

QMQ在携程的落地实践

QMQ(Qunar Message Queue)诞生于去哪儿网,初版基于MySQL存储。随着集团业务系统越发倚重消息解耦上下游,业务量的上涨随之带来消息量的增长,MySQL作为存储的瓶颈也越发明显。 比较自然的解决方案有两个:1)分库分表;2)换存储。与业界众多出名的消息队列(Kafka、RocketMQ、Pulsar等)一样,QMQ也走上了基于文件存储的分布式消息系统自研之路。后文的介绍, QMQ均指基于文件存储的版本。 在携程落地的过程中,我们主要和两类问题打交道:网络和磁盘IO。 一、网络 网

wangchewen的博客 687

YOLOv11涨点改进 | 全网独家创新,注意力改进篇 | TGRS 2025 | 引入APCM自适应像素级协同机制,动态增强目标区域、抑制背景噪声,助力YOLOv11做红外小目标检测有效涨点

本文提出了一种基于APCM模块改进的YOLOv11网络模型,通过像素级局部-全局协同建模增强目标特征并抑制背景噪声。APCM模块采用轻量化设计,无需复杂参数,能有效提升小目标检测性能。文章详细介绍了APCM的原理、优势及其在红外小目标检测中的应用,包括模块结构、核心代码实现和YAML配置文件修改方法。实验结果表明,该方法在NUAA-SIRST和IRSTD-1K数据集上优于现有技术,显著提高了复杂场景下的检测精度与鲁棒性。

Ai缝合怪、助力小伙伴高效发论文 116

【从零开始学习 UVM】1.1、UVM 概述 —— Preface

【从零开始学习 UVM】1.1、UVM 概述 —— Preface

努力,加油每一天鸭~ 824

如何实现延迟消息

分析延迟消息在业界成熟开源中间件的实现,总结提炼其设计难点和主流设计思想。

qq_40483675的博客 1728

我用 Python 监听了自己的键盘,生成击键热力图,看看每天到底在“摸鱼”还是“搬砖”?

数据采集(监听)、持久化(I/O)与可视化展示,必须是三个完全独立的模块,这符合单一职责原则。在多线程读写 Python 字典时,锁住的时间要尽可能短,防止 I/O 线程把高频的监听线程阻塞住。这类涉及底层的代码与“键盘记录木马”只有一线之隔。永远不要把击键记录通过网络上传,所有数据必须localhost消化。人脑对枯燥的 JSON 日志是不敏感的,但对颜色和空间极其敏感。这也是为什么 Prometheus + Grafana 是标配。使用ctypes。

BUG猿的博客 193

Apache Pulsar的Bookeeper架构和各种概念

目录1. Bookeeper的特点和使用场景2. entry、ledger、stream概念 1. Bookeeper的特点和使用场景 特点: 极低的延迟(小于5毫秒)读写entry流 能够持久、一致、容错地存储数据 在写数据时,能够进行流式追尾传输 有效地存储、访问历史数据与实时数据 能够在单个集群中或多个集群间提供跨机器复制 2. entry、ledger、stream概念 Bookkeeper中比较核心的元素: 记录(entry)、日志段(ledger)、日志流stream 关系是:多个记录形成一

Bulut0907 1039

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

BookKeeper设计介绍及其在Hadoop2.0 Namenode HA方案中的使用分析

BookKeeper背景 BK是一个可靠的日志流记录系统,用于将系统产生的日志(也可以是其他数据)记录在BK集群上,由BK这个第三方Storage保证数据存储的可靠和一致性。典型场景是系统写write-ahead log,即先把log写到BK上,再对log做处理,比如将log写到内存的数据结构中。BookKeeper同时适用于任何单点写入并要求保证高性能和数据不丢失(Strong Durab...

架构设计 383

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

开源Pravega架构解析:如何通过分层解决流存储的三大挑战?

当前的大数据处理系统无论是何种架构都面临一个共同的问题,即:“计算是原生的流计算,而存储却不是原生的流存储” 。Pravega 团队重新思考了这一基本的数据处理和存储规则,为这一场景重新设计了一种新的存储类型,即原生的流存储,命名为”Pravega”,取梵语中“Good Speed”之意。本文是“分布式流存储 Pravega 系列文章”第二篇,第一篇文章回顾《为什么你需要开源分布式流存储 Prav...

weixin_34007291的博客 347

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

08_Pulsar架构原理(Broker与Bookkeeper)、Pulsar分层存储、Bookkeeper架构、Bookkeeper相关名词概念、Bookkeeper整体架构

2.2.Pulsar架构原理(Broker与Bookkeeper)2.2.1.深入理解Pulsar分层存储2.2.2.深入理解Bookkeeper架构2.2.2.1.Bookkeeper相关名词概念2.2.2.2.Bookkeeper整体架构2.2.2.3.Bookkeeper整体架构。

涂作权的博客 1438

技术探究 | 得物技术对 BookKeeper 存储架构做源码级剖析

目录一、Pulsar存储架构简析二、Bookie的架构设计三、Bookie的数据写入流程1. client端源码分析2.server端源码分析 2.1 请求路由组件:BookieRequestProcessor 2.2 核心线程池任务:WriteEntryProcessorV3 2.3 存储引擎接口抽象:Bookie 2.4...

Apache Pulsar 1123

bookkeeper基本概念

Apache BookKeeper 的架构围绕 Ledger 和 Bookie 构建,通过分布式存储、元数据管理(ZooKeeper)和多副本机制,实现了高性能、高可用性和强一致性。它的基本概念(如 Ledger、Entry、Ensemble 等)是理解其工作原理的关键。如果您指的是其他“Bookkeeper”(例如某个特定软件或概念),请提供更多上下文,我会调整回答!

小诸葛的博客 982

Apache BookKeeper核心概念与架构解析

Apache BookKeeper核心概念与架构解析 什么是Apache BookKeeper? Apache BookKeeper是一个专为持久化存储日志流数据而设计的高性能服务系统。它将数据记录(称为entry)以序列形式存储在称为ledger的结构中,并通过多服务器复制机制确保数据的高可靠性。BookKeeper最初由雅虎开发,现已成为Apache顶级项目,广泛应用于分布式系统领域。 核心概...

gitblog_00871的博客 619

1.携程架构实践 --- 携程整体技术架构

第1 章 携程整体技术架构 架构的意义在于确定"主绳"的位置。架构实际代表的是一个方法论,这个方法论的核心思想在于构建目标的主要环节,主要环节一方面可以带动次要环节, 另外一方面还可以对次要环节的作用范围进行限制。 技术架构大体上可以划分为业务架构和整体技术架构两部分: 1.业务架构更加关注业务流程的技术实现,比如用户下单流程的制定,以及各个环节需要用到的支撑系统; 2.整体技术架构更加关注全局的技术解决方案,比如业务系统之间的通信方式,以及实时观测业务系统的运行状态。 1.1 携程技.

enlyhua的专栏 4911

qmq

消息队列使用场景:解耦/最终一致性/广播/错峰与流控(解决producer,consumer速度差异矛盾) 可靠投递(最终一致性):带来重复性问题和延迟,A机器加钱,B机器扣钱,A本地事务保证加钱和消息一起落地,A可反复重发保证消息broker落地,broker保证消息consumer(B)落地,达到分布式事物 业务解耦:A接口调用B,B消息调用A,避免循环依赖,你不再依赖多个下游了,只需要发消息...

kobexzf的博客 2138

Apache Pulsar BookKeeper深度解析:分布式账本存储原理

Apache BookKeeper作为Apache Pulsar的底层分布式账本存储系统,为Pulsar提供了高可用、持久化的消息存储能力。其核心设计目标是解决分布式系统中的数据一致性和可靠性问题,通过独特的架构设计实现了高效的读写性能和强大的容错能力。 BookKeeper采用了分层架构设计,主要包含客户端层、元数据管理层和存储层三个部分。客户端层提供了与应用程序交互的API接口;元数据管理层...

gitblog_01175的博客 652

Pulsar详解6—Pulsar的性能调优(示例:Go语言)

Pulsar的性能调优:Broker优化:内存管理、磁盘IO优化,生产者和消费者优化:批量发送、消费者领取,BookKeeper优化:写入性能优化、读取性能优化

风不归的乐园 2130

携程异步消息系统实践

【编者按】分布式系统是目前整个互联网行业百谈不厌的话题,无论是已经拥有海量用户的巨头公司,或是需要应用未来用户快速增长的初创团队,以及要靠高性能、可伸缩的系统特性来为广大开发者提供第三方服务的解决方案提供商,在进行服务端架构设计时,都无疑会使用分布式的部署方案。接下来请看顾庆分享的《携程异步消息系统实践》的文字整理。 顾庆:今天会跟大家分享一下我们在携程,现在应该是正在推广的一个新的消息系统...

博客 809
上一篇: 干货 | 携程机票iOS Widget实践
下一篇: 干货 | 携程百亿级缓存系统探索之路——本地缓存结构选型与内存压缩
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值