同程旅行基于 RocketMQ 高可用架构实践

![头图.jpeg](https://intranetproxy.alipay.com/skylark/lark/0/2021/jpeg/21156609/1625111231991-a192d1a000001上证指数实时行情1-fb61-49af-b3bc-7d44ca7173ca.jpeg#clientId=u9a3b2235-280a-4&from=ui&height=3429码的裤子腰围是多少1&id=uc18f90e9&margin=%5Bobject%20Object%5D&name=%E5%A4%B4%E5%9B%255是多少码的鞋子男BE.jpeg&or29岁女子带着两个孩子从24楼跳下i母亲节是哪一天ginHeight=523&originWidth=800&originalType=binary&ratio=2&size=63701&status=done&style=none&taskId=uae7架构92254-实践心得4526-41麻雀37-84a6-4kernel252601e85d&架构师工资一月多少amp;width=521)
# 背景介绍

## 为何选择 RocketMQ

29届奥运会主题口号们在几年前决定引入 MQ 时,市场上已经有不少成熟的解决方案,比如 RabbitMQ , ActiveMQ,NSQ,Kafka 等。考虑到稳定性、维护成本、公司技术栈等因素,我们选择了 RocketMQ

- 纯 Java 开发,无依赖马启越,使用简单000001上证指数,出现问题能 ho002190基金今天净值ld ;
- 经过阿里双十一考验,性能、稳定性可以保障;
- 功能实用,1785没钱上大学的我送端:同步、异步、单边、延时发送;消费端:消息重置,重试队列,死信队列;
- 社区活跃,出问题能实践活动及时沟通解决。

## 使用情况

- 主要用于削峰、解耦、异步处理;
- 已在火车票、机票、酒店等核心业务广泛使用,扛住巨大的微信入口流量;
- 在支付、订单、出票、数据同步等核心流程广泛使用;
- 每天 1000+ 亿条消息周转。

下图是 MQ 接入框架图

由于公司技术栈原因,client sdk 我们提供了 java sdk ;对于其他语言,1785赵兵王雅收敛到 http proxy ,屏蔽语言细节,节kernelsecurity约维护成本。按照各大业务线,对后端存储节架构是什么意思点进行了隔离,相互不影响。

![1.png](https:/架构师工资一月多少/intranetproxy.alipakernel蓝屏y.com/skylakernel32.dll没有找到输入点rk/lark/0/2021/png/21156609/1625111289783-623ce972-000e-4fc5-8实践的拼音07d-6f760c3da362.png#clientId=u9a3b2235-280a-4&from=ui&height=298&id=u5fd4369b&margin=%5Bobj2552ect%20Object%5D&name=1.png&originHeight=437&o007ri高可用架构ginWidth=866&o003834基金今天净值查询riginalType=binary&ratio=2&size=278526&kernel蓝屏;status=done&style=non00e&amkernel32.dll没有找到输入点p;taskId=u8ba91643-db46-418f-862d-2300b7fcf2d&width=590)​
# MQ 双中心改造

之前单机房出现过网络故障,对架构设计业务影响较大。为保障业务高可用,同城双中心改造提上了日程。

## 为何做255多少码男双中心

- 单机房故障业务可用;​
- 保证数据可靠实践是什么意思:若所有数据都在一个机房,一旦机房故障,数据有005827基金净值查询今天最新净值丢失风险;
- 横向扩容:单机房容量有限,多机房可分担流量。

## 双中心方案

做双中心之前,对同城马启越双中心方案作了些调研,主要有冷(热)备份、双活两种。(当时社区 Dledger 版本还没出现,Dledger 版本完29岁全可做为双中心的一种可选方案。)

1)同城冷(热)备份

两个独立kernel32dll无法定位的 MQ 集群, 用户流量写到一个主集群,数据实时同步到备用集群,社区有成熟的 RocketMQ Replicator 方案,需要定期同步元数据,比如主题,消费组,消费进度等。

![2.png](http实践s://intranetproxy.aliprocketmq安装ay.com/skyrocketmq集群lark/lark/0/2021/png/21156609/1625111382881-d790e5af-4ef8-高可用高并发4ced-ad93-98df6a6c60a0.png#clientId1785大写=u9a3002190基金今天净值b2235-280a-4&from=ui&height=283&id=u40b732de&MQ;margin=%5Bobject%20Object%5D&name=2.png&originHeight=420&orig005827基金净值查询今天最新净值inWidth=866&originalType=binary&ratio=2&size=80526&status=done&style=none&taskId=uc2cb0454-90ac-4619-b20c-866d23kernel3241dcf&width=584)
2)同城双活

两个独立 MQ 集群,用户流量写到各自机房的 MQ 集群,数据相互架构是什么意思不同步。

平时业务写入各自机房的 MQ 集群,若一个机房挂了,可以将用户请求流量全部切到另一个机房,消息也29周是怀孕几个月会生产到另一个机房。

![3.png](https://in高可用软件tranetproxy.alipay.com/skylark/lark/0/2021000001上证指数实时行情/png实践的拼音/21156609/1625111429549-aa3fae25-c737-4d85-8082-91da2cefd49d.p架构师需要掌握哪些知识ng#clientId=u9a3b2235-280a-4&from=ui&a000001上证指数mp;height=29周是怀孕几个月320&id=u67829665&margin=%5Bobject%20Object%5D&name=3.png&originHeight=母亲节是哪一天391&originWidth=675&originalType=binary&ratio=2&size=104991&status=done&实践是什么意思style=none&trocketmq保证消息不丢失askId=u99d1846d-7a9929-461f-a63a-f33ad5edca0&width=552)

对于007工作制双活方案,需要解决 MQ 集群域名。
1)若两个集群用一个域名,域名可以动态解析到各自机房。此方式要求生产、消费必须在同一个机房。假如生产在2550g是多少斤 idc1 ,消费在 idc2 ,这样生产、消费各自连接一个集群,没法消费数据。
2)若一个集群一个域名,业务方改动较大,我们之前对外服务的集群是单中心部署的,业务方已经大量接入,此方案推广较困难。
为尽可能减少业架构是什么意思务方改动,域名只母亲在线播放高清视频能继续使用之前的域名,最终我们采用一个 Globakernelbase.dll故障怎么处理l MQ 集群,跨双机房,无论业务是单中心部署还是双中心部署都不影响;kernel蓝屏而且只要升级客户端即可,无需改动任rocketmq集群何代码。
## 双中心诉求

- 就近原则:生产者在 A 机房,生产的消息存于 A 机房 broker ; 消费者在 A 机房,消费的消息来自 A 机房 broker 。
- 单机房故障:生产正常,消息不丢。
- broker 主节点故障:自动莫求仙缘选主。
## 就近原则

简单说,就是确定两件事:
- 节点(客户端节点,服务端节点)如何判断自己在哪个 idc;
- 客户端节点如何判断服务端节点在哪个 idc。
**如何判断自己在哪个 idc?**
**​**
1) ip 查询
节点启动时可以获取自身 ip ,通过公司内部的组件查询所在的机房。

2)环境感知
需要与运维同学一起配合,在节点装机时,将自身的一些元数据,比如机房信息等写入本地配置文件,启动时直接读写配置文件即可。
我们采用了第二个方案,无组件依赖,配置文件中 logicIkerneladiutordcUK 的值为机房标志。

![修改图.jpg](ht29周是怀孕几个月tps://intranetproxy.alipay.com/skylrocketmq工作原理ark/lark/0/2021/jpeg/21156609/1625111491492-3b18a27a-7cb2-45e0-af48-b2c68d775bfc.jpeg#clientId=u9a3b2235-28255棋牌0a-4&from=ui&id=ufe497442&margin=%5Bobject%20Objectrocketmq面试题%5D&name=%E4%BF%AE%E6%94%B9%E5%9B%BE.jpg&origi实践活动心得体会nHeight=230&originWidth=1226&o1785年中国是什么朝代rigi实践与认识的辩证关系nalType=binary&ratio=2&2921;size=26096&status=done&style=none&taskId=架构师ubaa15f88-9da4-42d4-ba54-776758ca61c)​
**客户端节点如何识别在同一个机房的服29周是怀孕几个月务端节点?**
**​**
客户端节点可以拿到服务端节点的 ip 以及 broker 名称的,因此:

- ip 查询:通过公司内部组件查询 ip 所在机房信息;没钱上大学的我
- broker 名称增加机房信息:在配置文件中,将机kernel房信息添加到 b母亲节是哪一天roker 名称上;
- 协议层增加机房标识:服务端节点向元数据系统注册时,将自身的机房信息一起注册。
相对于前架构师需要掌握哪些知识两者,实现起来略复杂,改动了协议kernel层, 我们采用了第二种与第三种结合的方式。
## 就近生产

基于上述分析,就近生产思路很清晰,默认优先本机房就近生产;

若本机房的服务节点不可用,可以尝试扩机房生产,业务可以根据实际需要具体配置。
![5.png](https://intranetproxy.alipay.com/skylark/lrocketmq面试题ark/0/2021/png/21156609/1625111530508-18b4f160-091b-4029-9d51-39a54924b485.pngkernelbase.dll故障怎么处理#clientId=u9a3b2235-280a-4&from=ui&height=265&id=ub684db85&margin=%5Bobject%20Ob高可用集群ject%5D&name=5.png&originHeight=345&origin005827易方达蓝筹精选Width=866&originalType=binary&ratio=2&size=111714&status=done&高可用amp;style=none&taskId=u3b1422c7-21e4-4e16-83ee-691fe2d7495&width=665)​
## 就近消费

优先本机房消费,默认情况下又要保证所有消息能被消费。

队列分配算法采用按机房分配队255棋牌

- 每个机房消息平均分给此机房消费端;
- 此机房没消费端,平分给其255棋牌app下载他机房消费端。

伪代码如下:

```cpp
Map mqs = classifyMQByIdc(mqAll);
Map cids = classifyCidByIdc(架构设计cidAll);
Set result = new HashSet;
for(element in mqs)实践论{
result.add(allocateMQAveragely(element, cids, cid)); //cid为当前客户端
}
```

消费场景主要是消费端单边部署与双边部署。

单边部署时,消费端默认会拉取每个机房的所有消息。
![6.png](https://intranetproxy.alipakernelbase.dll故障怎么处理y.com/skylark/lark/0/2021/png/21156609/1625111628783-844cc39d-36a5-4a3f-b马启越8a0-a38b29军fdfe8337.png#clientId=u9a3b2235-2架构设计80a1785年属什么生肖-4&from=ui&height=297&id=u5架构图模板c9345a1&mar实践论gin=%5Bobject%20Object29届奥运会主题口号%5D&name=6.png&originHeight=452&origin高可用性Width=866&originalType=高可用高并发binary&ratio=2&size=102306&status=done&style=none&taskId=u17cb92a0-9be7-4800-93b0-7ff160529d8&width=569)
双边部署时,消费端只会消费自己所在机高可用架构房的消息,要注意每个机房的实际生产量与消费端的数1785年中国是什么朝代量,防止出现某一个机房消费端过少。
![7.png](https://intra实践与认识的辩证关系netproxy.alipay.com/s1785次列车最新时刻表kylark/lark/0/202rocketmq安装1/png/21156609/162511005827基金净值查询今天最新净值1664720-6a910ce4-115a-49ed-9cbd-d46d005827基金净值查询今天最新净值981f4884.高可用高并发高性能png#cli290002基金今天净值entId=u9a3b2235-280a-4&from=ui&height=234&id=ub高可用软件b4000001上证指数65f80&margin=%5B实践与认识的辩证关系object%2255多少码男0Object%5D&name=7.png&000001上证指数实时行情originHeight=347&orig007工作制inWidth=86马犬6&o高可用高并发高性能riginalTkernel32dll无法定位ype=binary&ratio000001上证指数行情=2&size=122337&status=done&style=none&ta1785年skId=u706a59rocketmq顺序消息c2-2cf8-4740-b28e-ab24b5463e6&width=58000001上证指数行情5)​
## 单机房故障

- 每组 broker 配置
一主两从,一主一从在一机房,一从在另一机房;某一从同步完消息,消息即发送成功。

- 单机房故障
消息生产跨机房;未消费消息在另一机房继续被消费。
## 故障切主

在某一组 broker 主节点出现故障时,为保障整个集群的可用性,需要在 slave 中选主并切换。要做到这一点,首先得有个broker 主rocketmq源码故障的仲裁系统,即 nameserrocketmq工作原理ver(以下简称 ns )元数据系统(类似于 redis 中的哨兵)。

ns 元数据系统中的节点位于三个机房(有一个255棋牌app下载第三方的云机架构图用什么软件做房,在云上部署 ns 节点,元数据量不大1785年中国是什么朝代,延时可以接受),三个机房的 ns 节点通过 raft 协议选一个leader,br实践报告格式oker 节点会将元数000001上证指数据同步给 leader, leader实践活动 在将元数据架构师工资一月多少同步给 follower 。

客户端节点获取元数据时, 从 leader,follower 中均可读取数255是多大鞋码据。

![8.png](https://intranetproxrocketmq使用场景y.alipay.com/skylark/lark/0/2021/png/21156609/1625111722099-5d7b母亲节8d69-f905-4dcb-a3d4-c5dee2e0edcf.png#clientId=u9a3b2235-280a-4&from=ui&height=268&id=u17ae55a1&mkernel蓝屏argin=%5Bobject%20Object%5D&name=8.png&originHeight=375&originWidth=866&originalType=binary&ratio=2&kernelamp;size=104039&status=done&style=none&taskId=u43c8f1a2-bf93-4255mm是多少厘米770-980f-3678e057aaf&width=619)​
### 切主流程
**​**
- 若 nameserver leader 监控到 broker 主节点异常, 并要求其他 follower 确认;255半数 follower 认为 broker 节点异常,则 leader 通知在 broker 从节点中选主架构图用什么软件做,同步进度大的从节点选为主;
- 新选举的 b000001上证指数实时行情roker 主节点执行切换动作并注册到元数据系统;
- 生产端无法向旧 broker 主节点发送消息。

流程图如下
![9.png](https://intra178590欣奕除疤netp00roxy.alipay.com/skyl2550g是多少斤ark/lark/高可用mysql0/2021/png/21156609/1625111889859-9609de09-fbc4-4767-9fe4-ea4c6703bb69.png#cl架构设计ientId=u9a3b2235高可用高并发-280a-4&from=ui&height=231&id=u6d47b566&margin=%5Bobject高可用软件%20O2550g是多少斤bject%5D&name=9.png&originHeight=393&origikernel-powernWidth=866&originalType=binary&ratio=2&size=190207&status=done&style=none&taskId=u4653bb10-001d-4144-93de-f792479f050&wid高可用性th=509)![image.png](https://intra高可用架构netp架构图模板roxy.alipay.com/skylark/lark/0/2021/png/21156609/1625111205309-6a79256c-760a-439b-b3bc-75616032实践是什么意思64bc.png#clientId=u9a3b2235-280a-4&from=paste&id=ub63e98f1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1&originWid1785年瓦特改良蒸汽机th=1&originalType=url&ratio=2&size=68&status=done&style=none&taskId=u81e45308-9970-40d8-9af4-998a97829c0)

**切中心演练**
**​**
用户请求负载到双中心,下面的操作先将流量切到二中心---回归双中心---切到一中心。确保每个中心均可承担全量用户请求。
先将用户流量全部切到二中心
![10.png](https://intranetproxy.alipay.com/skylark/lark/0/2021/png/21156609/1625111916102-8dfe1774-2架构设计c00-4877-aa50-606fc9d2bf76.png#clientId=u9a3b2235-28kernel蓝屏0a-4&from=ui&height=239&id=u19074f4a&margin=%5Bobject%20Object%5D&name=10.png&originHeight=329周是怀孕几个月81&29码的裤子腰围是多少originWidth=866&originalType=binary&ratio=22550&size=122642架构图用什么软件做&s实践活动心得体会tatus=done&style=none&taskId=u000ce164母亲节-b022-47f8-b757-75b0daaf12007工作制f&width=543)
![image.png](https://intranetproxy.alipay.com/skylark/lark/0/2021/png/21156609/1625111205386-974004e1d9-7a74-4bc0-bf66-47a6d7a02e98.png#clientId=u9a3b2235-280a-4&from=paste&id=ua5f066ea&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1&originWidth=1&originalType=url&ratio=2&size=68&status=done&style=none&taskId=ud16521b6-63f7-4293-959rocketmq使用场景f-32a29岁女子带着两个孩子从24楼跳下c8e1d08b)
流量回归双中心,并kernel蓝屏切到一中心

![11.png](https://intranet255棋牌app下载proxy.a架构图用word怎么做出来的lipay.com/skylark/l莫求仙缘ark/0/2021/png马启越演员/211566kernel-power09/1625111935920-94491493-ec4e-4623马犬-9355-d28c41a5d09a.png#clientId=u9a3b2235-280a-4&from=ui&height=228&id=urocketmq工作原理c8269acc&margin=%5Bobj1785年瓦特改良蒸汽机ect%20Object%5D&name=11.png&orig马犬inHeight=370&originWidth=866&originalType=架构图模板binary&ratio=2&size=103242&status=done&style=none&taskId=u2e255棋牌app下载e5477b-e2a6-42b4-8815-a81b2e5d405&width=534)
**回顾**
**​**
- 全局 Glorocketmq源码bal 集群
- 就2552近原则
- 一主二从,写过半消息即及写入成功
- 元数据系统 raft 选主
- broker 主节点故障,自动选主
1785赵兵王雅
# MQ 平台治理

即使系统高性能、高可用,倘若随便使用或使用不规范,也会003834基金今天净值查询带来各种各样的问题,增高可用是什么意思啊加了不必要的维护成本,因此必要的治理手段不可或缺。

## 目的
​让系统更稳定
- 及时告警
- 快速定位、止损

## 治理哪些方面

**主题/消费组治理**
**​**
-架构图模板 申请使用
生产环境 MQ 集群,我们关闭了自动创建主题与消费组,使rocketmq顺序消息用前需要先申请并记录主题与消费组的项目标识与使用人。一旦出007工作制现问题,我们能够立即找到主题与消费组的负责人,了解相关情况。若存在测试,灰度,生产等多套环境,可以一次申请多个集群同时生效的方式,避免逐个集群申请的麻烦。

- 生产速度
为避免业务疏忽发送大量无用的消息,有必要在服务端rocketmq顺序消费原理对主题生产速度进行流控,避免这个主题挤占其他主题的处理资源。

- 消息积压
对消息堆积敏感的消费组,使用方可设置消息堆积数量的阈值以及报255mm是多少厘米警方式,超过这个阈值,立即通知使用方;亦可设置消息堆积时间的阈值,超过一段时间没被消费,立即通知使用方。

- 消费节点掉线
消费节点下线或一段时间无响应,需要通知给使用方。
**客户端治理**
**kernel32.dll没有找到输入点1785**
- 发送、消费耗时检测
监控发送/消费一条消息的耗时,检测出性能过低的应用,通知使用方着手改造架构师需要掌握哪些知识以提升性能;同时监控消息高可用是什么意思啊体大小,对消息体大小平均超过 10 KB 的项目,推动项目启用压缩或消息重构,将消息体控制在 10 KB 以内。

- 消息链路追踪
一条消息由哪个 ip 、在哪个时间点发送,又由哪些 ip 、在哪个时间点消费,再加上服务端统计的消息接收、消息推送的信息,构成了一条简单的消息链路追踪,将消息的生命周期串联起来,使用方可通过查询msgId或事先设置的 key 查看消母亲在线播放高清视频息、排查问题。

- 过低架构图或有隐患版本检测
随着功能的255棋牌app下载不断迭代,sdk 版本也会升级并可能引入风险。定时上报 sdk 版本,推动使用方升级有问题或过低的版本。
**服务端治理*000001上证指数*
**​**
- 集群健康巡检
如何判断一个集群是健康的?定时检测集群中节点数量、集群写入 tps 、消费 tps ,并模拟用户生产、消费消息。

- 集群性能巡检
性能指标最终反映在处理消息生产与消费的时间上。服务端统计处理每个生产、消费请求的时间,一个统计周期内实践活动,若存在一定比例的消息处理时间过长,则认为这个节1785年宪法点性能有问题;引起性能问题的原因主要是系统物理瓶颈,比如磁盘 io ut母亲在线播放高清视频il 使用率过高,cpu load 高等,这些硬件指标通过夜鹰监控系统自动报警。

- 集群高可用
高可用主要针对 broker 中 master 节点由于rocketmq顺序消息软硬件故障无法正常工作,slave 节点自动被切换为 ma255是多大鞋码ster ,适合消息顺序、集群完整性有要求的场景。

**部分后台操作展示**
主题与消费组申请
!29岁女子带着两个孩子从24楼跳下[12.png](https://intr高可用高并发高性能anetproxy.alipay.com/sky1785年属什么生肖lark/lark/0/2021/png/21156609/162511005827基金净值查询今天最新净值2043209-17e844cc-901e-47f0-824c-d8a86b9882d8.png#clientId=u9a3b2235-28255mm是多少厘米0a-4&from=ui&height=279&idkernel32=u491d9556&margin=%5Bobject%20Object%5D&name=12.png&origin架构师Height=437&007;originWirocketmq工作原理dth2552=866&a高可用软件mp;origina1785年中国是什么朝代lType=binary&ratio=2&size=77034&status=done&style=none&taskId=ud92099cf-5c5b-4b64-b2e6-0c5eddddd80&width=552)
高可用架构产,消费,堆积实时统计

![13.png](https://intkerneladiutorranetproxy.alipay.com/skylark/lark/0/2021/png/21156609/1625112061569-288292121694-b510-4199-9a高可用高并发高性能fc-5cff360028d7.png#clientId=u9a3b2235-280a-4&from=ui&height=327&id=uc41470f9&RocketMQamp;margin=%5Bobject%20Object%5D&name=13.png&originHeight=481&originWidth=866&rocketmq部署amp;originalType=bin实践的拼音ary&ratio=2&size=123158RocketMQ&status=done&style=none&taskId=u55caf4a3-1672-4c5d-98d3-6ede10818e实践5&width=589)

集群监控
![修改图2.jpg](htt实践报告ps://intranetproxy.alipay.com/sk29周是怀孕几个月ylark/l高可用架构ark/0/2021/jpeg/21156609/1625112080550-e3293真人秀场c4d451-7391-4d57-9255910-b0899bd6cb7c.jpeg#clientId=u架构设计9a3b2235-280a-4&am1785年发生了什么p;from=ui&height=331&id=u53753f4d&margin=%5Bobject%20Object%5D&name=%E4%BF%AE%E6%rocketmq顺序消息94%B9%E52550%9B%BE2.jpg&originHeight=005827基金净值查询今天最新净值443&originWidth=864&originalType=binary&实践活动心得体会amp;ratio=2&size=61522&sMQtatus=高可用架构done&style=none&实践报告amp;taskId=ud48071f2-7fd4-4666-9044-a8ca5888高可用软件661&width=646)
**29岁踩过的坑**
**​*架构是什么意思*
社区对 MQ 系统经历了长时间的改进与沉淀,我们在使用过程中也到过一些问题,要求我们能从深入了解实践心得源码,做到出现问题心不慌,快速止损架构图用word怎么做出来的

- 新老消费端并存时,我们实现的队列分配算法不兼容,做到兼容即可;
- 主没钱上大学的我题、消费组数量多,注1785年属什么生肖册耗时过长,内存 oom ,通过压缩缩短注册时间,社区已修复;
- topic 长度判断不一007工作制致,导致重启丢消息,社区已修复;
- centos 6.6 版本高可用mysql中,2550g是多少斤broker 进程假死,升级 os 版本即可架构师工资一月多少kernel32.dll没有找到输入点
### **MQ 未来展望**

目前消息保留时间较短,不方便对问题排查以及数据预测,我们接下来将对历史消息进行归档以及基于此的数据预测。

- 历史数据归档
- 底层存储剥离,计算与存储分离
- 基于历史数据,完成更多数据预测
- 服务端升级到 Dledger ,确保消实践报告格式息的严格一致

了解更多 RocketMQ 信息,可加入社区交流群,下面是钉钉群,欢迎大家加群留言。

![15.jpg](https://intranetproxy.al2550ipay.com/skylark/lark/0/2021/jpeg/21156609/1625112110540-10619ec6-3ca2-47d3-90cckerneladiutor-4edd19a29877.jpeg#cli29岁女子带着两个孩子从24楼跳下entId=u9a3b2235-280a-4&from=ui&height=482&id=ud4840710&am1785年p;mar实践报告gin=%5Bobject%20Object%5D&am母亲节p;na架构设计me=15.jpg&originHeight=720&origirocketmq工作原理nWidth=545&originalType=binary&rat1785年宪法io=2&size=144737&status=done&style=none&taskId=u4f1129f4-6e6d-实践的拼音44cf-8a99-a4d852b177b&width=365)