通过rabbitMQ消息队列实现分布式环境下的最终一致性

RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念) 一、消息队列使用场景或者其好处消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口 阅读详情

话不多说,直接切入正题:

TODO-LIST

  • 需求: 购买商品
  • 前提: 水平分库分表
    • 实现方案:
      • [] 2PC(CP)
        • 所需要覆盖的测试情况:
          • [] 协调者挂,参与者未挂,协调者重启|协调者集群
          • [] 协调者没挂,参与者挂 ,参与者重启
          • [] 两个都挂了,两个都重启
      • [] 3PC(CP)
        • 所需要覆盖的测试情况:
      • [] TCC
      • MQ最终一致性 (AP)

概念解释

CAP

  • 名词解析
    • C :Consistent 一致性 : 集群中所有的及其状态都是一致的
    • A: Avaliable 可用性 : 无论怎样,总能得到请求的处理
    • P: Paration 分区容忍性
  • CAP作为理论基础:
    • 关系型数据库(MySQL):CA(放弃容忍性)
    • HBase: CP(放弃可用性)

2PC:

3PC:

TCC:


更新日志

  • 2019-03-05
    • 最后应该会用Golang来写一个demo,至于具体的时间,not sure yet
  • 2019-02-17
    • 16:41
      • 今天重新看了下我那个项目,做了以下的优化:
        1. 建立了一个单独的@RabbitMQTransaction ,然后AOP拦截
        2. 参数有一个独特的Wrapper:UserRecordAspectWrapper,不仅用于存放事务的数据,而且结合了日志的记录,只是提供思路,以后也完全可以通过aop简化
  • 2019-02-10
    • 模块间需要重新设计,看下流程图与总结吧,慢慢更新
  • 2018-09-13
    • demo应该明天会给出
  • 2018-09-18 更:
    • 整体架构:3个微服务:server-1,server-2,message //message为消息服务中心

  • 基础流程图:
    上游服务流程图

  • 上游服务接收到信息,先保存在本地消息表中,保存失败直接返回退出,保存成功则通知消息服务器new一个新的消息对象,状态为NEW,表示这个可能要发送,通知成功(注意这里的通知这一步需要为同步模式,不然会出现这种情况,本地已经消费了,但是却没通知到,这样消息就丢失了)

  • 通知成功之后则开始处理本地的业务逻辑,失败的时候手动抛出异常,让业务回滚,成功之后,可以异步/同步的方式通知消息服务器更新状态,在其中的任意环节出现失败都不会影响一致性,这时候是处于软安全的状态,不会影响一致性,为什么不会影响呢,因为本地有表记录着啊,而本地失败的情况下回造成业务回滚,从而记录为空的,如这种情况:最后一步,服务本地业务成功,异步通知消息服务器可以更改状态为ready让其发送消息,假设失败了,意味着消息服务器中的状态依旧为NEW,但是没关系,本地成功了,消息服务器后台会有个线程,自动检测超时状态下的,当处于NEW状态的消息会通过上游服务器提供的接口查询记录是否存在(或者状态是否为消费),如果有记录表明是消费了的,这个消息应该被发送,所以修改状态问ready,然后发送

    下游服务器流程图:
    下游服务流程图

    在这里插入图片描述

  • 然后创建表,为了演示只需要简单创建表即可:
    在这里插入图片描述
    以及server-1对应的本地业务表:
    在这里插入图片描述
    至于server-2的就不展示了,大家随意创建一个即可
    dao省略,直接进入核心的sevice:

@Service
public class MQTransactionService
{
	@Autowired
	private MessageDao messageDao;
	@Autowired
	private UserService userService;
	@Autowired
	private IMessageServerFeignServiec messageServerFeignServiec;
	
	@Transactional(rollbackFor=Exception.class)
	public String testRabbitMqTransaction(String detail)
	{
		//插入本地消息表
		Integer localMessageValidCount = messageDao.insert(detail);
		if(localMessageValidCount<=0)
		{
			return "fail";
		}
		//通知远程服务,添加消息
		try
		{
			Integer remoteMessageValidCount = messageServerFeignServiec.addMessage(detail);
			if(remoteMessageValidCount<=0)
			{
				throw new RuntimeException("手动抛异常回滚:远程通知服务器失败,插入数据失败");
			}
		} catch (Exception e)
		{
			throw new RuntimeException("手动抛异常回滚:远程通知服务器失败",e);
		}
		//执行本地业务
		Integer logicValidCount = userService.insert("joker");
		if(logicValidCount<=0)
		{
			throw new RuntimeException("手动抛异常回滚:本地执行业务失败");
		}
		//调用其他服务的接口

		//通知远程服务器更新状态
		Integer updateStautsValidCount = messageServerFeignServiec.updateMsgStatus((long) detail.hashCode(), 1);
		if(updateStautsValidCount<=0)
		{
			throw new RuntimeException("手动抛异常回滚:远程更新消息状态失败");
		}
		return "succes";
	}
}
  • 核心思路就是确保每步都成功再执行下一步,不过关于消息通知这块,可以考虑用异步的方式,不过这样的话需要在message-server中添加一个定时器,定时扫描那些消息状态改变了却没发送的,同时上游服务需要开放一个接口,供消息服务器调用查询信息是否存在(因为如果上游消费成功了,是会在db中插入数据的),并且相对的,下游服务器也是需要提供接口的,用于检测任务是否已经被消费(是否存在)
    简易demo地址,未深入设计,在项目中是慢慢一点一点深入的

总结

  • 消息服务器中消息状态的变化:NEW->READY->WAIT_PUBLISH_CONFIRM->PUBLISH_CONFIRM->CONSUMER_RECEIVED->CONSUMER_CONSUMED

    • 上游服务消息状态的分类:
      • NEW: 代表本地插入消息表的初始状态(并且消息服务消息创建插入成功)
      • LOCAL_FINISHED: 本地业务执行成功(当消息服务查询接口成功时可删除)
    • 消息服务:消息状态的分类:
      • NEW: 上游服务器本地插入消息同步消息服务器中新建消息,状态为NEW(ps:流程可以修改,既异步改为同步的情况下,消息的新建可以在本地业务执行完毕之后才通知消息服务器,并且这个消息状态直接为READY状态)
      • READY: 上游服务器本地业务执行成功,异步通知消息服务器修改消息状态为READY,可以发送(业务而定,具体看压力而定,压力小直接发送,压力大作为任务处理)
      • WAIT_PUBLISH_CONFIRM: 消息发送的时候修改状态,表明这个消息已经发送,但是未确认发送成功,通过publish-confirm broker与消息服务自主交互修改状态
      • PUBLISH_CONFIRM: 代表消息发送成功,但是未被下游服务消费
      • CONSUMER_RECEIVED: 代表下游服务成功收到消息
      • CONSUMER_CONSUMED: 代表下游服务消费成功,同时这个任务会被删除
      • CANCEL: 可有可无,具体看压力而定,压力小直接删除,压力大作为任务处理
    • 下游服务消息状态的分类:
      • RECEIVED: 代表消息收到了,但是还未处理
      • CONSUMED: 代表消息已经成功被消费了
  • 生产者消息状态确认

    • 消息服务器会定时轮询消息表的状态,当发现消息为NEW并且超时的时候,意味着
      • 上游服务前半程就挂了(通知远程服务创建消息成功之后,本地新建消息记录失败:如服务宕机或者未知原因)
      • 上游服务本地插入成功,但是上游服务通知失败(如:服务宕机,或者网络通讯通知消息服务失败)
      • 解决方法: 上游服务开放消息查询接口,消息服务调用,然后进行状态匹配,如果上游的消息状态处于LOCAL_FINISHED,则修改消息状态为READY,或者直接发送(业务而定,业务可以有level评级)
  • 消费者消息状态确认

    • 消息服务器定时轮询消息表的状态,
      • 当发现消息为PUBLISH_CONFIRMED并且超时
        • 可能是消费者过慢,或者是超时时间过段,因而这里可以动态调整
      • 当发现消息为CONSUMER_RECEIVED并且超时:
        • 可能是消费者本地插入失败
        • 可能是消费者消费成功了,但是通知失败了
        • 解决方法: 下游服务开放消息查询接口,消息服务调用,然后进行状态匹配,如果下游的消息处于CONSUMED,通常可能是网络延迟,或者是业务逻辑耗时与超时不匹配则消息服务直接更改消息状态为CONSUMER_CONSUMED即可,如果无记录则可能是服务宕机了,则消息服务修改状态为READY,准备再次发送
  • 上游服务如何得知下游服务消费成功了:

    • 答: 本质上是MQ+RPC的通信,方式很简单,重点在于发送的对象AppEvent,内部添加correlationId和replyTo 当下游服务器消费成功之后,携带correlationId自动往replyTo的queue发送消息,上游服务器监听,创建的是临时队列,因而不需要担心内存问题
  • 如何保证接口的幂等性(既防止重复消费)

    • 答: 通过消息表,每个服务都会有一个消息表,处理逻辑之前都先判断是否已经存在记录
  • 如何确认消息发送成功

    • 答: 有两种确认方式:
      • 通过下游服务器的消息表,下游服务器开放一个接口,消息服务器后台线程对超时的消息手动发出http请求校验状态
      • publisher 使用publish-confirm机制: 消息属性为persistent的消息会持久化到硬盘之后才confirm,而transient的消息则会入队就confirm
  • 如何解决MQ的乱序,有两种乱序的情况

    • 第一种是发送的时候乱序:在这种情况下,很可能会M2先于M1被发送,因而解决方法是:
      • 核心是一个生产者producer对应一个MQServer: 因为消息服务是可靠的,也就意味着肯定会有集群,eureka有个api能够获取到某个名称服务的所有服务列表,因而同一业务的设置同一关键字key,key%服务的list长度,这样就使得某个业务的所有消息体AppEvent都会被发送到某个服务器中,而这个服务器可以申明BlockingQueue作为容器存储某些有次序的消息,然后发送的时候一个一个取即可:也就意味着消息有分类,有些强调次序,有些次序无关
    • 第二种是消费的乱序,上述虽然保证了发送的顺序,但是不能保证消费的顺序
      • 解决方法是: 通过回调函数,既发送了M1之后,消费者消费之后手动调用AppEvent的callBack函数:通知消息服务器可以发送M2了,
        • 对于MQServer而言:消息体AppEvent的设置可以参考tcp协议中的部分,如设置二进制位MA(more AppEvent)位,代表后序还有消息需要消费,然后回调函数的时候根据某种特征(可以名字+数字,然后数字++的形式)通知消息服务器取出这个特定的消息然后发送,这里又延伸出几个小问题:
          • 如果发布到了其他消费者怎么办,其他消费者不知道该不该消费这个
            • 无关紧要,因为当消息发出的时候,要么是第一个消息自动发送的,要么是下个消息,而下个消息必定是收到了通知才发送出去的,也就意味着上一个消息必然是完成了的
          • 如果消息超时了还未发出:可能的原因有:
            • 消费者宕机了:这个无关紧要,重新发送即可
            • 消费者消费成功了,但是网络阻塞,延迟收到:也无关紧要,继续重新发送,原因在下面?
            • 总结:如果非第一个消息长久未发送:啥也不需要管,直接发送即可;注意:这里的消息特指非第一个消息,为什么?因为我们的消息是通过通知发送的,而第一个消息是不需要通知即可发送的,因此我们同样也模仿tcp头结构,只在第一个消息体上设置某个二进制位为1代表是第一个消息
        • 对于消费者而言:
          • 先回答上面的问题,上面的问题就是如何防止消息的重复消费,解决方法是消费者本地消息记录,但是呢,当设计分库分表的时候还是可取的,因为这时候只会是分表,而不会分库,因而完全ok

注意点

  • 上游服务本地消息表插入记录与消息服务插入记录的先后顺序,消息服务消息表插入要先与本地服务:

    • 理由: 反证法:试想这种情况,本地消息先插入了,但是通知的时候服务宕机了,并且并没有开启事务,而是手动rollback,则本地消息表就会多了冗余的一条记录,(本地也可以轮询消息表,但是很不推荐,因为职责就不单一了,并且没必要),而当消息服务先插入之后,消息服务会有一个后台线程轮询,当发现状态为NEW,且超时,则会上访上游接口,上游接口反馈没有,则消息服务删除即可
  • 下游服务本地消息表插入基于与消息通知的先后顺序,本地插入先于消息通知:

    • 理由: 这个逻辑很简单,就是如果插入失败了,则消息服务消息的状态会为CONSUMER_RECEIVED,而本地却没有,消息就遗漏了;当然,消息服务有一个后台线程自动轮询,因而其实这个顺序无关紧要
.NET CORE消息队列RabbitMQ RabbitMQ是一个开源的消息代理和队列服务器,用于在分布式系统中传递消息。它支持多种消息协议,提供可靠的消息传递、灵活的路由、集群和高可用性功能。 阅读详情

相关推荐

大数据分布式事务:RabbitMQ实现最终一致性

在大数据时代,企业的业务系统往往由多个服务组成,这些服务分布在不同的节点上,形成了分布式系统。分布式系统中的事务处理面临着诸多挑战,如网络延迟、节点故障等,传统的事务处理方式(如ACID特性)在分布式环境下难以实现。本文的目的是探讨如何利用RabbitMQ消息队列来实现大数据分布式事务的最终一致性,范围涵盖了分布式事务和最终一致性的基本概念、RabbitMQ的工作原理、具体的实现步骤、数学模型和实际应用场景等方面。本文将按照以下结构进行组织:首先介绍分布式事务和最终一致性的核心概念及其联系;

AI天才研究院 1416

分布式事务之使用MQ异步解耦的消息最终一致性方案

为什么要做成异步的并使用MQ 上文已经说过,不管是2PC、3PC都没有根本解决性能问题,而如果通过MQ的事务消息来进行异步解耦,会提升系统性能。 服务进行模块化拆分,便于提高系统模块重用度,使开发和维护可以并行进行,提高效率。 系统扩展性更高。 团队协作流程也会得到改善。 异步/分布式会出现消息一致性的问题 消息生成者发送消息 MQ收到消息,将消息进行...

打破沉默的博客 1358

基于MQ的单项消息接发系统设计与实现

生产者-消费者模型由三个基本组件构成:生产者(Producer)消费者(Consumer)和共享缓冲区(Shared Buffer)。生产者负责创建并放入消息到缓冲区中;消费者从缓冲区取出消息进行处理;缓冲区通常采用先进先出(FIFO)的队列结构来保证消息顺序。该模型的关键优势在于实现了计算与I/O操作的分离。例如,在电商系统中,用户下单后订单服务作为生产者将订单消息推送到队列,而库存、物流、通知等下游服务作为消费者各自订阅相关主题,按需拉取消息进行后续处理。

weixin_35257663的博客 1086

rabbitmq ,mq可靠消息最终一致性方案的核心流程

①上游服务投递消息 如果要实现可靠消息最终一致性方案,一般你可以自己写一个可靠消息服务,实现一些业务逻辑。 首先,上游服务需要发送一条消息给可靠消息服务。这条消息说白了,你可以认为是对下游服务一个接口的调用,里面包含了对应的一些请求参数。 然后,可靠消息服务就得把这条消息存储到自己的数据库里去,状态为“待确认”。 接着,上游服务就可以执行自己本地的数据库操作,根据自己的执行结果,再次调用可靠消息服...

lixiangfei4的博客 1240

实现分布式事务最终一致性的RabbitMQ+延迟队列方案

本文还有配套的精品资源,点击获取 简介:在分布式系统中,确保数据一致性的传统ACID事务模型难以实现,因此采用“最终一致性”策略作为替代。RabbitMQ的消息中间件和其延迟队列插件可用来实现订单与库存系统间的分布式事务最终一致性。本方案通过设置延迟队列,在订单创建后延时执行库存扣减,以及配置补偿机制和监控报警系统来维持系统稳定性和可用性。 1. 分布式系统数据一...

weixin_42627459的博客 1593

基于消息队列最终一致性的分布式事务实战Demo

看到这里,你应该明白了:最终一致性 ≠ 放弃一致性,而是一种更符合分布式现实的设计哲学。它通过“异步 + 幂等 + 重试 + 补偿”的组合拳,在可用性、性能、可靠性之间找到了最优平衡点。而在 Java 生态中,借助 Spring + RabbitMQ/Kafka + Outbox 模式,我们可以非常优雅地实现这一架构。核心要点回顾:✅ 使用事件驱动架构(EDA),解耦服务依赖✅ 保证消息可靠投递:发件箱模式 or Kafka 事务。

weixin_35949153的博客 346

基于RabbitMQ的分布式事务最终一致性解决方案

1. 分布式事务 所谓事务,通俗一点讲就是一系列操作要么同时成功,要么同时失败。而分布式事务就是这一系列的操作在不同的节点上,那要如何保证事务的ACID特性呢。 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都成功,要么都失败。 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务

qq_40857365的博客 4295

解决ublox无法定位问题(一直输出$GxTXT)

最近开始研究有关RTK技术的项目,于是先购买了两块ublox公司的NEO-M8T-0型号芯片。(注意NEO-M8T还细分为NEO-M8T-0和NEO-M8T-2,前者不支持RTCM输出,后者支持RTCM输出) 首先都是按常规步骤,直接把芯片模块串口接电脑调试,这边推荐是用官网的u-center调试软件。GPS芯片大多数都是上电后串口自动发送定位等信息,这两块芯片有一块正常情...

众缈之门的博客 7358

如何保证mq的有序性_在分布式系统中,如何实现最终一致性?多种设计方案深入分析。...

本文参考《持续演进的Cloud Native云原生架构下微服务最佳实践》一书整理而成,分析了在分布式系统中,如何实现最终一致性。如何实现最终一致性?在分布式系统中,实现强一致性并不容易。即使2PC、3PC阶段提交,也无法保证绝对的强一致性。我们也不能因为极小的不一致性概率,导致系统性能低下,或者扩展性受到影响,并且架构也变得极其复杂。因此,在2PC/3PC提交缺乏大规模应用的情况下,最终一致性是一...

weixin_31765677的博客 340

ADS 使用教程(十八)Encrypting Designs using RFIP Encoder in ADS

在这一节,我们使用RFIP Encoder进行设计加密,这是一种保护知识产权和敏感设计数据的重要方法。RFIP Encoder提供了一种安全的方式来加密设计文件,确保只有授权人员能够访问和使用这些文件。

Dirge19的博客 1169

从零构建:如何用MATLAB打造你的第一个Stewart平台运动学仿真器

本文详细介绍了如何使用MATLAB从零构建一个六自由度Stewart平台运动学仿真器,涵盖基础理论、环境配置、运动学建模、动态轨迹规划和实时可视化实现。通过MATLAB的Robotics System Toolbox和Simulink等工具,读者可以掌握六自由度Stewart平台的逆运动学求解、正运动学求解及仿真系统集成,适用于飞行模拟器和精密定位等应用场景。

peach的博客 864

分布式事务解决方案-可靠消息最终一致性

分布式事务解决方案之可靠消息最终一致性 什么是可靠消息最终一致性事务 可靠消息最终一致性方案是指当事务发起方执行完成本地事务后并发出一条消息,事务参与方(消息消费者)一定能 够接收消息并处理事务成功,此方案强调的是只要消息发给事务参与方最终事务要达到一致。 此方案是利用消息中间件完成,如下图: 事务发起方(消息生产方)将消息发给消息中间件,事务参与方从消息中间件接收消息,事务发起方和消息中间件 之间,事务参与方(消息消费方)和消息中间件之间都是通过网络通信,由于网络通信的不确定性会导致分布式事 务问题。

wry的博客 734

FPGA实战:手把手教你用Verilog驱动4.3寸RGB触摸屏(附完整代码)

本文详细介绍了如何使用Verilog语言在FPGA上驱动4.3寸RGB触摸屏,包括时序设计、信号交互原理及完整代码实现。通过双计数器引擎设计和参数化模块,开发者可以高效构建800*480分辨率的显示驱动,并解决工程实践中的信号完整性和时序收敛问题。

rice5的博客 701

消息队列八股不靠死背:跟着逆境扛过一次大促

消息队列实战:从大促故障看异步系统设计要点 摘要:本文通过电商大促场景,剖析消息队列四大核心问题——消息丢失、重复消费、顺序错乱和积压处理。首先分析消息队列的异步、解耦和削峰价值,同时指出其带来的复杂性代价。然后针对消息可靠性,提出生产-存储-消费三段保障方案:生产者重试补偿、Broker持久化、消费者后确认机制。对于重复消费问题,重点讲解唯一索引、去重表等幂等设计方法。文章强调,消息队列并非万能解药,需根据业务特点权衡利弊,在最终一致性和运维成本间取得平衡。最后指出,真实场景往往采用"至少一次投递+消费幂

2401_87662859的博客 359

GPFS扩展技术原理(十一)-FMDN广播与EID加解密

GFPS扩展技术原理(十一)FMDN广播及EID加解密

十多年蓝牙协议软件开发,擅长蓝牙协议分析 935

02-Redis 核心特性与数据结构详解:揭秘高性能的技术内核

本文深度拆解 Redis 高性能的技术内核:揭秘其凭“内存存储 + C 语言开发” 实现微秒级延迟、10 万 + QPS 的性能优势;详解 5 种基础数据类型(String/Hash 等)与 4 种扩展数据类型(Stream/Geospatial 等)的特性及场景;还介绍多语言支持、RDB/AOF 持久化、主从复制 / 哨兵 / 集群等高可用方案,助读者掌握 Redis 技术核心与实践逻辑。

蜗牛老师,专注编程领域 995

C#基础开发实现RabbitMQ消息队列通信

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,支持多种消息协议,广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。

kkkkkkiidu的博客 2853

rk3568 适配以太网(mac 2 mac)

MDIO(Management Data Input/Output)是一种管理数据输入/输出协议,用于在以太网交换机和PHY(物理层收发器)之间进行通信。在Android中,MDIO总线用于控制网络接口的PHY芯片,例如通过MDIO总线访问PHY芯片的寄存器。这些寄存器包含了一些关于网络连接状态、链路速度和其他计算机网络相关信息的数据。MDIO总线通常由网络接口控制器(NIC)使用,以便在OS中管理PHY芯片。在Android设备上,MDIO总线通常由内核驱动程序管理,并且可以通过 /sys/bus/mdi

weixin_35723192的博客 2453

分布式消息队列RabbitMQ

这篇文章简单讲述下分布式消息队列的基础知识,不会太深入,因为类似MQ这样的分布式组件有很多不同的种类,都有各自的特征和其对应的应用场景,需要在实际应用中才能更加深入的理解。 整篇文章按照,分布式消息队列基础知识->AMQP协议->RabbitMQ实例来概述。 1、分布式消息队列基础知识 消息 要想弄清楚分布式消息队列的具体意义,首先得从什么是消息入手。 消息即是信息的载体。为了让消息发...

Zuoerfeng 2993

RK3566-预装APP

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

qq_24093081的博客 701

pscad IEEE标准系统搭建说明

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

分布式消息队列:RabbitMQ(一)

本文介绍了RabbitMQ的基本概念和安装方法。RabbitMQ作为一款支持多种协议(AMQP/STOMP/MQTT)的分布式消息队列,具有生态优秀、易于学习的特点,是入门消息队列的首选。文章详细讲解了RabbitMQ的核心组件和工作流程,包括生产者、消费者、交换机和队列等概念。针对不同操作系统,提供了Windows和Docker两种安装方式:Windows下需先安装Erlang环境再安装RabbitMQ,最后启用管理插件;Docker安装则推荐使用带管理界面的镜像。两种方式都包含详细的操作步骤和验证方法。

z030622的博客 1000

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

RabbitMQ消息队列常见面试题总结

RabbitMQ消息队列常见面试题总结; 1、什么是消息队列?消息队列的优缺点? 2、Kafka、ActiveMQ、RabbitMQ、RocketMQ的区别? 3、如何保证消息不被重复消费? 4、如何保证消息不丢失,进行可靠性传输? 5、如何保证消息的有序性? 6、如何处理消息堆积情况? 7、如何保证消息队列的高可用?

张维鹏的博客 7万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

消息队列 基础入门(小白必看)

前言 消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段。它具有 低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。 当前使用较多的 消息队列 有 RabbitMQ、 RocketMQ、 ActiveMQ、 Kafka、 ZeroMQ、 MetaMQ 等,而部分 数据库 如 Redis、 MySQL 以及 phxsql 也可实现消息队列的功能。 1.消息队列概述 消息队列 是指利用 高效可靠 的 消息传递机制 进行与平台无关的 数据交流,并基于 数据通信 来进行分布式系统的集成。 通过提供

qq_39751320的博客 5991

分布式场景下如何保证消息队列实现最终一致性

考虑一个分布式场景中一个常见的场景:服务A执行某个数据库操作成功后,会发送一条消息到消息队列,现在希望只有数据库操作执行成功才发送这条消息。下面是一些常见的作法: 1. 先执行数据库操作,再发送消息 public void purchaseOrder() { orderDao.save...

chiying2039的博客 227

Java开发 - 消息队列之RabbitMQ初体验

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。所以在Java业务中使用很多,目前我所知道的很多都是用的此消息队列,只不过大家评价都是:功能强,性能一般。与其相反的,就是Kafka了:性能强,功能弱。

CodingFire的博客 4907

分布式消息队列详解

消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦弹性伸缩冗余存储流量削峰异步通信数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足轻重的地位。

F_wait_H的博客 2702
上一篇: RabbitMQ消息队列的学习
下一篇: 数据库水平分库分表后的数据分页查询解决方案
Coder_Joker
博客等级 码龄8年 39粉丝 67原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值