业务系统对消息中间件的要求(接上一篇《分布式消息中间件中的一些概念》)

在大型互联网中,主要采用消息中间件来进行业务的解耦和操作的异步化,这也是消息中间件最基础的特点,也是业务系统对消息中间件的最基本需求。

在这个基础之上,本篇来谈一下业务系统从功能、性能等各个方面对消息中间件的需求。

功能

功能需求核心的其实就发送消息和消费消息,细化下去,发送需求会有同步发送、异步发送,会有实时消息、定时消息等;消费需求会有各种模式,比如业务方主动Pull、或者消息中间件Push的模式等等。

 

消息发送

消息发送功能从编程接口的角度出发就只有两个需求:同步发送接口和异步发送接口。

从消息类型的角度出发,会有以下几点需求:

  1. 实时消息
  2. 定时消息
  3. 事务消息

实时消息最简单了,Producer发送一条消息,这条消息对Consumer是立即可见的,会尽快被消费掉的。

定时消息则是Producer发出一条消息后,这条消息不是立即可见,可以被消费的,它需要等待一个固定时间之后才能被Consumer进行消息。

事务消息的含义是说它是和业务操作绑定在一起的,要么业务操作成功且消息发送成功,如果业务操作失败,消息是需要回滚的。这里的事务其实就是表明了业务操作是消息是在一个事务内的,要么都成功,要么都失败。

对事务消息多说一点。事务消息是个非常有趣的东西,因为业务操作和发送消息是两个完全独立的事情,是一个分布式事务,保证他们的一致性就变得非常困难。操作中如果先发消息再做业务,那么可能出现消息发送成功而业务做失败了,此时就需要撤销消息(这样理解其实事务消息称为可撤销的消息,即如果业务执行失败了,将发送的消息撤销);如果是先做业务再发消息,那么可能出现业务做成功了消息发送失败了,此时就需要撤销业务(先做业务有明显的问题是消息发送的结果除了成功和失败,还会有超时的状态,是无法确认是否发送成功的)。

这里会引申出两阶段提交,第一阶段发送消息,之后等业务完成后执行第二阶段对消息进行提交。对事务消息,之后会专门出一篇文章描述场景和实现方案的。

另外消息发送还会有顺序性的要求,消息的消费顺序需要和发送顺序保持一致。

消息消费

消费方式上需要提供集群消费和广播消费(这两个概念再上一篇都讲过了)。另外对消息获取的方式也会有特定的需求,比如一些业务方是期望由他们自己主动去获取消息的,另一些会要求以监听的模式,即提供Listener当有新消息时触发Listener(对使用Pull还是Push模式也是非常有意思的一点,在之后会写一篇专门的文章讨论我们我们是怎么选择Pull和Push的)。

和发送一样,消费端也需要保证消息顺序(废话,如果只保证发送的顺序,打这个顺序在消费的时候错乱了,那顺序又有什么意义)。

除了这些基础需求,消费时还会有位点重置的需求,即可以主动去修改消费位点来重新消费消息。

另外从功能上还会有消息跟踪、消息堆积之类的需求。业务方需要知道一条消息的运行轨迹,定位一条消息从产生到经过MQ,再到被消费的完整轨迹。在高峰期,消息需要先堆积在MQ中之后进行消费(就是削峰的作用)。

性能

性能就两点:延迟和吞吐。

对业务系统而言,它本身不会容忍在执行消息发送时消耗过多的时间,因为过长的耗时将直接影响它系统的吞吐,所以一般对消息的发送延迟要求都是毫秒级的,平均需要在2ms左右吧。对消费也是一样,对实时性要求比较高的系统响应的会期望消息从发送出来到被消费到的这个时间尽可能的短。

吞吐也是一样,因为直接影响到使用MQ的业务系统的性能,所以也是需要一个超过业务系统吞吐上限的能力。RocketMQ给出的性能指标是10字节的消息单机TPS在7w左右,但是没有给机器指标给出消息延迟之类的指标,笔者也没有测试验证过。

可用性

互联网产品我们会经常听到高可用的概念,会要求7*24小时运行,可用性达到99.99%之类的描述。可用性是指系统可以提供服务的正常运行时间和总运行时间的比值。

对业务系统而言,中间件是他们依赖的服务,当然是希望可用性越高越好,但是现实中网络是会故障的,机器是会宕机的,磁盘是会损坏的。所以对消息中间件而言,一般会要求99.99%的可用性之类的,即365天内不可用的时间不允许超过1个小时。

为了满足可用性的要求,系统需要做备份等等,这些在之后的文章中也会展开去讨论。

可靠性

在消息中间件中,业务方对可靠性的要求主要集中在消息会不会丢失。消息不丢失也是对消息中间件最最基础的要求。

以上内容参考了部分RocketMQ的文档和阿里云上MQ的文档。

结语

这篇文章简单的概述了一下消息中间件的一些需求,部分需求并非核心需求,比如消息轨迹这样的需求可能是在你的消息中间件已经完成的基础下再去谈的。

公众号在计划写文章时的出发点是去写一个类似《从入门到XXX??》的系列文章,所以会先聚焦在核心的功能上不会展开去讨论像消息轨迹的实现之类的(可能会放到很后面)。

另外一点也在考虑要不要同时去写一个讨论幂等、一致性之类的分支,毕竟好像这几篇都太基础了,没啥干货。??

最后,下一篇可能会写如何满足可用性、可靠性的需求,即在可用性和可靠性的基础上去讨论系统架构的选型,暂时叫《消息中间件架构讨论》吧(题目取得有点大了)。

欢迎关注此公众号交流消息中间件相关的技术、经验等。

时间: 2024-11-05 12:29:46

业务系统对消息中间件的要求(接上一篇《分布式消息中间件中的一些概念》)的相关文章

接上一篇中记录Echarts进度环使用【不同状态不同进度环颜色及圈内文字】--采用单实例业务进行说明

接上一篇中记录Echarts进度环使用 此处处理不同状态下不同进度环颜色及圈内文字等的相关处理,采用实际案例源码说明 -----------------偶是华丽丽分割线--------------------------------------------------- 业务上此处拿一个有期限任务实例举例说明 业务简要说明: [任务按时间 可分为 未开始--进行中--已结束 3大状态//其中已开始任务中任务状态又需要根据完成情况(提交与否)显示对应圈内文字] 核心地方如图已标出 接下来我们可以自

腾讯万亿级分布式消息中间件TubeMQ正式开源

TubeMQ是腾讯在2013年自研的分布式消息中间件系统,专注服务大数据场景下海量数据的高性能存储和传输,经过近7年上万亿的海量数据沉淀,目前日均接入量超过25万亿条.较之于众多明星的开源MQ组件,TubeMQ在海量实践(稳定性+性能)和低成本方面有着比较好的核心优势. TubeMQ 捐赠 Apache 基金会 9月12日,Apache软件基金会成立20周年之际,腾讯在ApacheCon宣布TubeMQ 开源.TubeMQ 启动计划捐赠 Apache 基金会的流程. TubeMQ系统特点 1.

什么是分布式消息中间件?

什么是分布式消息中间件? 什么是分布式消息中间件? 对于分布式消息中间件,首先要了解两个基础的概念,即什么是分布式系统,什么又是中间件. 分布式系统 "A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messasges."--<Distributed Syst

[转]分布式消息中间件 MetaQ 作者庄晓丹专访

MetaQ(全称Metamorphosis)是一个高性能.高可用.可扩展的分布式消息中间件,思路起源于LinkedIn的Kafka,但并不是Kafka的一个Copy.MetaQ具有消息存储顺序写.吞吐量大和支持本地和XA事务等特性,适用于大吞吐量.顺序消息.广播和日志数据传输等场景,目前在淘宝和支付宝有着广泛的应用.   Github地址:  链接地址 为了使大家对MetaQ有进一步的了解,本期我们采访了MetaQ的核心开发者庄晓丹.  欢迎大家推荐更多开源项目给我们,支持中国的开源项目发展,如

经典sql-获取当前文章的上一篇和下一篇

我们在做资讯类的网站的时候,肯定会有这么一个需求,就是在资讯内容页的下方需要给出上一篇和下一篇资讯的链接.上次我一同事兼好友兼室友就遇到了这么一个需求,一开始我们都把问题想复杂了,先取的是符合条件的资讯信息集合,然后再找到当前这条资讯信息在集合中的索引,通过索引再找到他的上一篇资讯和下一篇资讯信息,这种做法确实是可以实现这个需求,但是一旦资讯信息的数量过大,很有可能因为这段代码导致整个资讯内容页半天都打不开,所以,必须得另辟蹊径. 其实这个问题很简单,后来经过我们主管给我们稍微一指点,瞬间觉得高

spring+springmvc+kafka分布式消息中间件集成方案

Honghu的消息服务平台已经抛弃了之前的ActiveMQ,改用高吞吐量比较大的Kafka分布式消息中间件方案: kafka消息平台使用spring+kafka的集成方案,详情如下: 1. 使用最高版本2.1.0.RELEASE集成jar包:spring-integration-kafka 2. Zookeeper.Kafka分布式集群使用init.properties配置化方案. Java代码 kafka.servers=127.0.0.1:9092 kafka.topic=xxxooo [j

基于BootStrap的initupload()实现Excel上传和获取excel中的数据

简单说明:后边要做exl解析(还没做呢),所以先有一个excel的的上传以及获取excel中的数据,展示出来. 代码: //html代码 <div class="btn-group"> <button class="btn sbold green" id="" onclick="initUpload('excelFile','/vraxx/rightAxx/upload');"> <span cl

个人永久性免费-Excel催化剂功能第20波-Excel与Sqlserver零门槛交互-数据上传篇

Excel作为众多数据存储的交换介质,在不同的系统内的数据很少可以很连贯地进行整合分析,一般的业务系统都会提供导出Excel作为标配功能供用户使用系统内生成的数据. 此时最大的问题是,Excel很维去成为各个数据源的整合方,其数据存储能力和运算能力一直是众多深度Excel用户们一大头痛的事情,当数据量一大,做什么操作都会慢下来. 今天Excel催化剂将给大家带来全新的解决方案,Excel与Sqlserver深度集成,在Excel上的数据源能轻松上传至Sqlserver中,实现以Sqlserver

继上一篇Django的数据库数据的编辑和删除

继上一篇Django的数据库数据的编辑和删除 首先需要写一个能够展示数据库一张表中所有数据的 html 页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jq