架构训练营学习笔记3-5:消息队列备选架构设计实战

news2024/11/20 1:36:49

本文属于架构训练营学习笔记系列:模块3的案例讲解

总的来说,这篇从更高的维度去讲,而不是关注消息队列的常见问题:比如消息如何发送,消息如何不丢失 ,消息如何不重复。总体上分为2部分:利益干系人分析和复杂度分析、备选架构设计。

注意:这个案例得结合李老师当时所在公司的背景,2014年uc 刚被阿里收购的情况。放到现在再说自研mq.大概率会被否掉的,因为常见的kafka,rocketmq 基本上能满足需求,即使有个性化的需求,方案也可以考虑基于rocketmq做定制化改动。这里主要是看基于当时的情况,去做架构设计的一个思路。

  背景:   

1.中间件团队规模不大,大约6人左右。

2.中间件团队熟悉Java语言,但有一个同事C/C++很牛。

3.开发平台是Linux,数据库是MySQL。

4.目前整个业务系统是单机房部署,没有双机房。

5.刚刚被阿里以创纪录的金额收购。

这些需要 实地考虑的制约架构的因素。

利益干系人分析

这里跟模块3之前文章类似,这里从架构角度很重要,搞不定后面就没法开展。

 利益干系人诉求排序

可用性:业务优先考虑可用性(就是不能因为mq丢失消息影响业务)

可维护性:各种维护操作要方便,例如收发消息情况、权限控制、上下线等

成本:开发成本不能太高

复杂度分析

高性能:不需要高性能,游戏新版本发布和VIP充值的消息并不多

这里不要误会,不要高性能,也得满足业务需求。 

高可用:需要,游戏版本发布和VIP都是高优先级业务

可扩展:不需要,消息队列的功能基本明确,无需扩展

成本:开发投入人力和时间不能太长

备选架构:

 备选架构1 kafka

 备选架构2-自研集群+MySQL存储

这个图有些抽象,不是常见的发送--》队列---》接受那种模型图

 备选架构3-自研集群+自研存储

1.模拟Kafka的原理,用Java语言实现,也可以用LSM数据结构来存储消息

2.可以保证高可用高性能

3.加上可维护性的各种能力,嵌入到已有的运维体系 

 4 备选架构4-直接用阿里的MetaQ

架构决策 

确定排序规则:1.可用性;2.可维护性;3.人力成本

 评估后符合的只有方案2

详细架构

详细架构设计1-Role&Relation 

【客户端Role设计】1.客户端采用Java语言开发,基于Netty实现与服务端交互

【服务器Role设计】1.服务器基于Netty开发,采用Reactor网络模型

2.两台服务器组成一个sharding,整个系统可以多个sharding,每个sharding包含一主一从两台服务器(可以对比MongoDBshard)

3.主服务器提供消息读写操作,从服务器只提供消息读取操作

4.服务器基于ZooKeeper进行主从切换

 【客户端和服务器的Relation设计】

1.客户端与服务端采用TCP连接,采用Json传递数据

2.为了兼容非Java系统,服务端同时提供HTTP接口

【MySQL的Role和Relation设计】

1.采用MySQL主从同步

2.每个消息队列对应一个表

3.消息表最多存储30天内的消息,过期的自动清除

4.直接用MySQL的主从复制来实现数据复制

详细架构设计2-Rule

  【消息发布】

1.消息队列系统设计两个角色:生产者和消费者,每个角色都有唯一的名称。

2.消息队列系统提供SDK供各业务系统调用,SDK从配置中读取所有消息队列系统的服务器信息,SDK采取轮询算法发起消息写入请求给主服务器。

3.如果某个主服务器无响应或者返回错误,SDK将发起请求发送到下一台主服务,相当于在客户端实现了分片的功能

【消息读取】

1.消息队列系统提供SDK供各业务系统调用,SDK从配置中读取所有消息队列系统的服务器信息,轮流向所有服务器发起消息读取请求。

2.消息队列服务器需要记录每个消费者的消费状态,即当前消费者已经读取到了哪条消息,当收到消息读取请求时,返回下一条未被读取的消息给消费者。

3.默认情况下主服务器提供读写服务,当主服务器挂掉后,从服务器提供读消息服务

【服务器主从切换】

1.同一组的主从服务器配置相同的group名称,在ZooKeeper建立对应的PERSISENT节点

2.主从服务器启动后,在ZooKeeper对应的group节点下建立EPHEMERAL节点,名称分为为master和slave

3.从服务器watch主服务器的master节点状态,当master节点超时被删除后,从服务器接管读消息,收到客户端SDK的读消息请求后返回消息,收到客户端SDK的写请求直接拒绝。

消息队列管理系统

小结

 这些架构还是挺抽象的,消息队列主要解决应用耦合,异步消息,流量削锋等问题,还可以结合之前那篇58到家mq【沈老师 架构师之路:MQ消息整理系列】_58mq.on_bohu83的博客-CSDN博客

来看,那篇更具体,细节更多。李老师讲了很多有趣的点,比如使用MySQL做消息队列存储通常会引起别人质疑,尤其是性能不达标的时候。分库分表这种得考虑好。为啥要引入HTTP接口,还是兼容其他语言调用,而不是对应去 开发SDK。后来他回忆,这个恰当的造轮子在他考核升级的时候发挥了重大作用,也算是一个主要业绩点。

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

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

相关文章

LaTex 1【字体、符号、表格】

​(上一期已经安装完软件,但是突然出现了一点子问题不会解决,先用overleaf来学习吧,网站还是很给力的) 关键字部分: \quad:代表空格【无论你打多少个空格都不是空格,要输入“\quad”】 字体部分…

github进不去的解决办法

github就凭运气进吧,偶尔能进去。 介绍几个可以快速进的办法: 第一个,安装插件:(在microsoft搜索watt toolkit插件并安装) 然后勾选github选项: 接着返回你github网站就可以了。 第二个&#…

简单工厂模式详解

文章目录 前言一、简单工厂模式定义二、举个例子三、简单工厂模式的缺点总结 前言 本篇我们了解一下简单工厂模式,它是设计模式的雏形,是学习设计模式的开端,我会结合案例说明它的设计思路。 一、简单工厂模式定义 简单工厂模式并不是GoF23…

JSX的基础使用

1. JSX嵌入变量作为子元素的使用 ①当变量是Number、String、Array类型时,可以直接显示; ②当变量是null、undefined、Boolean类型时,内容为空; 若想要展示nul、undefined、Boolean类型,转字符串;转换方式…

堆--二叉树的特有形式

目录 前言1.二叉树的顺序结构及实现1.1二叉树的顺序结构1.2堆的概念及结构 2.堆的功能函数的实现2.1堆结构体的定义2.2堆的初始化2.3堆的插入2.4 获取堆是否为空、堆大小、堆顶元素的函数2.5堆的销毁2.6对利用堆结构数组的数据建堆2.7堆的删除堆结构的源码 3.堆排序建堆的时间复…

2核4G服务器能安装多少个网站?亲测

2核4G服务器能安装多少个网站?2核4g配置能承载多少个网站?一台2核4G服务器可以安装多少个网站?阿腾云2核4G5M带宽服务器目前安装了14个网站,从技术角度是没有限制的,只要云服务器性能够用,想安装几个网站就…

AE关键帧

关键帧 根据上次说到的五大变换,找准起始时间点和起始动作再去找结束时间点和结束动作,其中包括可使用贝塞尔曲线对锚点进行拖拽,使其完成曲线运动 快捷键 n删除右侧,b删除左侧,ctrlshiftd裁剪,ctrld复制…

我记忆中的电脑城

目录 一、我记忆中的电脑城 二、电脑城衰退 三、拥抱趋势 在过去很长一段时间里,想要购买电子设备都逃不开一个叫“电脑城”的地方,那里鱼龙混杂良莠不齐,是令许多人记忆深刻分外难忘之处。 一、我记忆中的电脑城 想起上一次去电脑城&…

ylb-接口11实名认证

总览: 在web模块config包下,创建实名认证的一个配置类JdwxRealnameConfig: package com.bjpowernode.front.config;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype…

【NI USRP】 USRP 硬件资源和性能是怎么样的呢?是如何构成的呢

B系列 型号频段最大带宽通道FPGAADI 芯片B200mini70 MHZ - 6 GHZ56 MHz1X1Xilinx Spartan-6 XC6SLX150AD9364B200mini-i70 MHZ - 6 GHZ56 MHz1X1Xilinx Spartan-6 XC6SLX75AD9364B205mini-i70 MHZ - 6 GHZ56 MHz1X1Xilinx Spartan-6 XC6SLX75AD9364B20070 MHZ - 6 GHZ56 MHz1X…

AN OVERVIEW OF LANGUAGE MODELS RECENT DEVELOPMENTS AND OUTLOOK

LLM系列相关文章,针对《AN OVERVIEW OF LANGUAGE MODELS: RECENT DEVELOPMENTS AND OUTLOOK》的翻译。 语言模型综述:近年来的发展与展望 摘要1 引言2 语言模型的类型2.1 结构化LM2.2 双向LM2.3 置换LM 3 语言单元3.1 字符3.2 单词和子单词3.2.1 基于统…

Java正则表达式捕获组

捕获组是将多个字符视为一个单元的一种方法。 它们是通过将要分组的字符放在一组括号中来创建的。 例如,正则表达式(dog)创建包含字母d,o和g的单个组。 捕获组通过从左到右计算它们的左括号来编号。 在表达式((A)(B(C)))中,例如,…

Xline 源码解读(一) —— 初识 CURP 协议

01、Xline是什么 Xline 是一款开源的分布式 KV 存储引擎,其核心目的是实现高性能的跨数据中心强一致性,提供跨数据中心的meatdata 管理。那么 Xline 是怎么实现这种高性能的跨数据中心强一致性的呢?这篇文章就将带领大家一起来一探究竟。 02…

GAMES101 OpenCV环境安装

文章目录 Opencv 库编译Step 1.下载源码Step 2. 使用CMake编译Step3. 解决CMake 过程中的报错错误1: 错误的Python版本:错误1 解决办法 错误2:下载ippicv_2020_win_ia32_20191018_general.zip失败错误2 解决办法 错误3:ffmpeg相关文件下载失败…

ROS学习笔记(0):几个重要概念:节点、消息、主题、服务

1、节点(node) 节点是进行运算任务的进程。一个系统可以由很多节点组成,节点也可以称为软件模块。 ROS是以节点的形式开发的,节点是根据其目的,可以细分的可执行程序的最小单位。 主节点 由于机器人的元器件很多&…

win10查看、关闭和开启多个mysql服务

我的之前安装了2个MySQL版本,一个是MySQL8.0.17,一个是MySQL5.7.19 为什么要查看怎么关闭MySQL服务?如果是个人电脑,我觉得开启一个服务相当于开启一个进程,可能会占用部分内存。如果自己是游戏摆烂状态(非学习状态&…

R语言forestploter包优雅的绘制孟德尔随机化研究森林图

在既往文章中,我们对孟德尔随机化研究做了一个简单的介绍。我们可以发现,使用TwoSampleMR包做出来的森林图并不是很美观。今天我们使用R语言forestploter包优雅的绘制孟德尔随机化研究森林图。 使用TwoSampleMR包做出来的森林图是这样的 而很多SCI文章…

qt和vue的交互

1、首先在vue项目中引入qwebchannel /******************************************************************************** Copyright (C) 2016 The Qt Company Ltd.** Copyright (C) 2016 Klarlvdalens Datakonsult AB, a KDAB Group company, infokdab.com, author Milian …

简易评分系统

目录 一、实验目的 二、操作环境 三、实验内容和过程 1.实验内容 2.代码 2.1 用户验证功能 2.2 菜单函数 2.3 评分功能 四、结果分析 总体的输出结果: 保存文件成功截图: 五、小结 一、实验目的 1.巩固和提高学生学过的基础理论和专业知识&am…

windows下安装consul、springboot整合consul

Spring Cloud Consul通过自动配置和绑定到Spring Environment和其他Spring编程模型习语,为Spring Boot应用程序提供Consul集成。通过一些简单的注解,可以快速启用和配置应用程序内的常用模式,并使用Hashicorp的Consul构建大型分布式系统。提供…