思维训练-怎样设计一个MQ

架构师需要做各种设计,要不断地提高自己的设计能力。这有没有方法可以训练呢?有的,就是看到什么、想到什么,就假设对面坐着产品经理,一起讨论怎么把它设计出来。比如怎样设计一个MQ

我:首先我确认一下需求。从功能性需求和非功能性需求两方面来看。先看功能性需求:要设计MQ,本身来说就要求: 发送、接收和存储,存储是先进先出的。那还有其他的需求吗?比如我是只需要在程序逻辑中用JVM内实现,还是需要跨进程、跨平台?

产品经理:需要跨进程、跨平台

我:那假设发送端是producer、接收端是consumer,存储端是broker。i那就需要解决broker与两端的通信问题。可以使用成熟的RPC框架,这样就不需要考虑 服务注册与发现、负载均衡和序列化方式的问题了。

先把最简单的架构图画出来:

ffbecad24e3a17c042dddfeae299628e.png

需要支持发布订阅吗?

产品经理:需要支持发布订阅

我:可以给发布的消息设置主题,将一类消息发布到同一个主题中,消费端来订阅相关主题的消息。

85a8692a6b610449256cb456569705ce.png

再来考虑一下非功能需求。在高可用方面有什么要求吗?

产品经理:需要保证高可用

我:可以使用多副本模式增加复制因子(kafka MQ里有个主题复制因子的概念,其实就是副本数)来提高可用性,通过服务注册与发现、超时与重试、负载均衡、发送和消费时的ack来保证可用性。存储方面,对性能和可靠性有要求吗?

产品经理:有要求怎么办,没有要求怎么办呢?

我:如果不追求很高的性能可以使用数据库等方案。可靠性要求不高的话直接用内存或者分布式缓存也可以。追求性能的话,目前主流的方式是采用追加写日志顺序写盘+索引文件的方式。索引设计上可以考虑稀疏或者稠密索引(稠密索引是所有的数据条目都能通过索引找到,稀疏索引是数据分段出现在索引中,通过索引可以找到第一个数据的地址,再通过第一个数据找到想要的数据)。查找消息可以采用跳表或者二分查找等。还可以通过操作系统的页缓存和零拷贝等技术来提高操作系统的读写性能。

对吞吐量有什么要求?

产品经理:需要每秒处理500M的消息

我:kafka单节点处理能力在每秒100M左右,那就需要建立多个分区来进行水平扩展。如果没有特殊要求的话,生产端到分区,分区到消费端都可以采用轮询的策略来进行分区分配。

产品经理:有的消息,需要保证它的顺序,这个需要处理一下。

我:可以在生产端到分区的分配策略上,如果指定了分区就发到指定分区,如果指定了key可以按照key来进行hash分配,如果这两个都没指定再按照轮询来分配。这样,指定了分区的和指定了key的都会发到一个分区中,在同一个分区中的消息是有序的。

总结

按照这种思维方式思考下去,MQ的原理都可以思考地很明白,同时也提高了设计能力。思考的过程中还会将具体的用词在脑子过一遍,有些不清楚可以通过搜索学习来让自己的用词更加专业,从而达到一个总体的技术提升。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nodejs+vue+ElementUi摄影预约服务网站系统91f0v

本系统提供给管理员对首页,个人中心,用户管理,员工管理,摄影套餐管理,套餐系列管理,客片欣赏管理,摄影预约管理,摄影订单管理,取片通知管理,摄影评价管理&…

优化算法3D可视化

编程实现优化算法,并3D可视化 1. 函数3D可视化 分别画出 和 的3D图 import numpy as np from matplotlib import pyplot as plt import torch# 画出x**2 class Op(object):def __init__(self):passdef __call__(self, inputs):return self.forward(inputs)def for…

分布式系统架构设计之分布式数据存储的分类和组合策略

在现下科技发展迅猛的背景下,分布式系统已经成为许多大规模应用和服务的基础架构。分布式架构的设计不仅仅是一项技术挑战,更是对数据存储、管理和处理能力的严峻考验。随着云原生、大数据、人工智能等技术的崛起,分布式系统对于数据的高效存…

Springer build pdf乱码

在textstudio中编辑时没有错误,在editor manager生成pdf时报错。 首先不要改源文件,着重看你的上传顺序: 将.tex文件,.bst文件,.cls文件,.bib文件, .bbl文件的类型,在editor manager中是Item。…

Hive集群出现报错信息解决办法

一、报错信息:hive> show databases;FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient 解决办法:1.删除mysql中的元数据库(metastore&#xff0…

【owt-server】一些构建项目梳理

【owt-server】清理日志:owt、srs、ffmpeg 【owt】p2p client mfc 工程梳理【m98】webrtc vs2017构建带符号的debug库【OWT】梳理构建的webrtc和owt mfc工程 m79的mfc客户端及owt-client

代码随想录刷题第三十五天| 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球|

代码随想录刷题第三十五天 柠檬水找零 (LC 860) 题目思路: 代码实现: class Solution:def lemonadeChange(self, bills: List[int]) -> bool:five 0ten 0for money in bills:if money 5:five1if money 10:if five>0:five-1ten1else:return …

基于FPGA的数字电路(PWM脉宽调制)

一.PWM的制作原理 假如我们有一个锯齿波,然后在锯齿波上设置一个阈值(黑色水平虚线),凡是大于该阈值时输出均为高电平,反之则为低电平,这样我们是不是就得到一个PWM信号呢?如果我们想调整它的占…

数据库中的锁

锁 锁冲突是针对事务的,另一个事务能不能申请上锁,是和其他事务竞争。 一个事务内部可以加很多锁,互相并不会冲突。 级联回滚调度 多个事务有依赖关系,如果一个事务回滚,那么所有事务也需要回滚。 冲突的数据加锁安…

【力扣题解】P106-从中序与后序遍历序列构造二叉树-Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P106-从中序与后序遍历序列构造二叉树-Java题解🌏题目描述💡题…

Linux:apache优化(1)—— 长链接/保持连接

系统:CentOS 7.9 apache版本为:2.4.25 需要使用源码包进行安装才能够使用这些扩展模块 在使用这些扩展模块前要先下载zlib-devel 安装--enable-deflate选项需要的网页压缩传输的软件包 yum -y install zlib-devel 在配置编译安装时需要使用扩展配置 ./config…

模式识别与机器学习-集成学习

集成学习 集成学习思想过拟合与欠拟合判断方法 K折交叉验证BootstrapBagging随机森林的特点和工作原理: BoostingAdaBoost工作原理:AdaBoost的特点和优点:AdaBoost的缺点: Gradient Boosting工作原理:Gradient Boostin…

【机器学习合集】深度生成模型 ->(个人学习记录笔记)

深度生成模型 深度生成模型基础 1. 监督学习与无监督学习 1.1 监督学习 定义 在真值标签Y的指导下,学习一个映射函数F,使得F(X)Y 判别模型 Discriminative Model,即判别式模型,又称为条件模型,或条件概率模型 生…

Linux驱动开发简易流程

推荐视频: 正点原子【第四期】手把手教你学 Linux之驱动开发篇 小智-学长嵌入式Linux&Android底层开发入门教程 能力矩阵 基础能力矩阵 熟悉c/c、熟悉数据结构 熟悉linux系统,Shell脚本,Makefile/cmake/mk 文件IO、多线程、竞争、并发…

基于Python的B站排行榜大数据分析与可视化系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文介绍了一项基于Python的B站排行榜大数据分析与可视化系统的研究。通过网络爬虫技术,系统能够自动分析B站网址,提取大量相关文本信息并存储在系统中。通过对这些信息进行…

nginx+keepalived实现七层负载

目录 一、部署nginx01、nginx02 二、keepalived配置(抢占模式、master- backup模式) 三、测试 四、非抢占模式(backup-backup模式) nginx01 11.0.1.31nginx0211.0.1.32虚拟IP(VIP)11.0.1.30 一、部署ngin…

Android实验:contentprovider 实验+SQLite 数据库的实现

目录 SQLite实验目的实验内容实验要求项目结构代码实现结果展示 SQLite SQLite 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库系统不同,…

虚拟化技术和云计算的关系

1、云计算底层就是虚拟化技术。 (1)常见的虚拟化技术:VMware(闭源的,需要收费)、XEN、KVM (2)大部分公司用的虚拟化方案:XEN、KVM 2、虚拟化的历史 (1&am…

鸿蒙 Window 环境的搭建

鸿蒙操作系统是国内自研的新一代的智能终端操作系统,支持多种终端设备部署,能够适配不同类别的硬件资源和功能需求。是一款面向万物互联的全场景分布式操作系统。 下载、安装与配置 DevEco Studio支持Windows系统和macOS系统 Windows系统配置华为官方推…

LSTM中文新闻分类源码详解

LSTM中文新闻分类 一、导包二、读取数据三、数据预处理1.分词、去掉停用词和数字、字母转换成小写等2.新闻文本标签数值化 三、创建词汇表/词典1.data.Field()2.空格切分等3.构建词汇表/词典使用训练集构建单词表,vectorsNone:没有使用预训练好的词向量,而是使用的是…