1.概述

我们知道在使用RabbitMQ时,生产者将消息发布出去之后,消息是否顺利到达broker代理服务器呢?默认情况下发布操作没有任何信息返回给生产者,也就是生产者是不知道消息有没有顺利到达broker。如果在消息到达broker之前已经丢失了,那发布的消息就更不会到达队列并被消费者消费。如果出现上述情况,就会造成生产者发布的消息与消费者消费的消息不一致的问题。

2.RabbitMQ自带的解决方案

RabbitMQ提供以下两种方式解决上述问题。

2.1事务机制

事务机制能够解决生产者与broker之间消息确认的问题,只有消息成功被broker接受,事务才能提交成功,否则就进行事务回滚操作并进行消息重发。但是使用事务机制会降低RabbitMQ的消息吞吐量,不适用于需要发布大量消息的业务场景。

2.2消息确认机制

生产者将信道设置成confirm模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了。
与事务机制相比较,确认机制采用异步回调方式来处理确认消息,性能得到了较大的提升,可以确保数据同步的一致性。

3.新的解决方案

为了最大限度的提升MQ数据同步的性能,自己制定了一个更好的解决方案,现分享如下。
解决方案:MQ+Redis+接口。
MQ:作为消息队列中间件负责同步数据;
Redis:负责存储每天(或每批次等)生产者已发送数据的唯一标识,即全量存储已发送数据唯一标识,方便消费者检查并同步失败数据;
接口:作为补偿措施,用于消费者获取同步失败的数据。

下面分两个使用场景说明。

4.单表数据同步场景

(1)生产者发送数据至MQ Server,同时记录已发送数据的唯一标识(如id),每同步一批次(比如N条)后,再把该批次的唯一标识存入Redis。
(2)存储唯一标识的key及过期时间,需要根据数据的同步策略具体制定。比如:若每天同步一次数据,就可以以“队列名称+日期”为key,把这一天所有生产者已发送数据的唯一标识存入同一个list中。
(3)消费者消费数据后,负责检查已消费数据唯一标识与Redis中唯一标识是否有差异,若存在差异,则说明有数据同步失败。
(4)对于同步失败数据,消费者调用生产者提供的接口实时获取。接口以唯一标识为入参,并控制每次请求的数据量,比如每次最多同步200条等。

5.复杂业务数据同步场景

复杂业务数据是指生成者需要一定的业务逻辑处理产生的数据。
关于复杂业务数据的同步,考虑到同步失败的场景,需要持久化这类数据。然后按单表数据同步场景进行数据的同步。

RabbitMQ数据同步一致性解决方案的更多相关文章

  1. 不同数据源之间的数据同步jdbc解决方案

    最近项目中用到的数据要从一个数据源获取存进另一个数据源,简单的jdbc解决方案. package com.sh.ideal.test.syns; import java.sql.Connection; ...

  2. PDA手持终端扫描条码开单打印一体 结合后台电脑系统 数据同步交互解决方案

    PDA通过扫描商品条码移动开单,实现便携式办公,伴随式销售,PDA能通过WIFI无线局域网.GPRS互联网直接与主机连接,让公司业务人员能随时随地了解公司产品信息,直接扫描商品条码,进行开单.入库.库 ...

  3. 如何解决分布式系统数据事务一致性问题(HBase加Solr)

    如何解决分布式系统数据事务一致性问题 (HBase加Solr) 摘要:对于所有的分布式系统,我想事务一致性问题是极其非常重要的问题,因为它直接影响到系统的可用性.本文以下所述所要解决的问题是:对于入H ...

  4. 转载:MySQL和Redis 数据同步解决方案整理

    from: http://blog.csdn.net/langzi7758521/article/details/52611910 最近在做一个Redis箱格信息数据同步到数据库Mysql的功能. 自 ...

  5. 两台SQL Server数据同步解决方案

    复制的概念 复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式.使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可 ...

  6. 040 RabbitMq及数据同步02

    1.Spring AMQP (1)简介 Spring有很多不同的项目,其中就有对AMQP的支持: Spring AMQP的页面:http://spring.io/projects/spring-amq ...

  7. 【Canal】互联网背景下有哪些数据同步需求和解决方案?看完我知道了!!

    写在前面 在当今互联网行业,尤其是现在分布式.微服务开发环境下,为了提高搜索效率,以及搜索的精准度,会大量使用Redis.Memcached等NoSQL数据库,也会使用大量的Solr.Elastics ...

  8. 【Canal】数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!

    写在前面 在当今互联网行业,尤其是现在分布式.微服务开发环境下,为了提高搜索效率,以及搜索的精准度,会大量使用Redis.Memcached等NoSQL数据库,也会使用大量的Solr.Elastics ...

  9. NoSQL数据库:数据的一致性

    NoSQL数据库:数据的一致性 读取一致性 强一致性 在任何时间访问集群中任一结点,得到的数据结果一致: 用户一致性 对同一用户,访问集群期间得到的数据一致: 解决用户一致性:使用粘性会话,将会话绑定 ...

随机推荐

  1. Linux下git安装配置

    一.Linux下git安装配置 2013-07-28 20:32:10|  分类: 默认分类 |  标签:linux  git  server  |举报|字号 订阅     http://abomby ...

  2. Ubuntu 18.04 安装 CUDA 9.0

    sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb sudo apt-key add /var/cuda-repo-< ...

  3. 英语单词deploy

    来源——https://www.docker.com/ Leading companies rely on our container platform to build, manage and se ...

  4. SQL Server数据库的软硬件性能瓶颈

    在过去十年里,很多复杂的企业应用都是用Microsoft SQL Server进行开发和部署的.如今,SQL Server已经成为现代业务应用的基石,并且它还是很多大公司业务流程的核心.SQL Ser ...

  5. php中substr_compare()区分大小写吗

    PHP substr_compare() 函数 定义和用法 substr_compare() 函数从指定的开始位置比较两个字符串. 提示:该函数是二进制安全且选择性地对大小写敏感(区分大小写). 语法 ...

  6. vu项目中按F5刷新element菜单没有根据路由匹配菜单解决办法

    element组件的菜单中设置:default-active,这个是选择哪个菜单的 然后在created里边增加 因为每次刷新都是要经过这个的.注意data里边也要同步.

  7. jsqlparser

    摘要:SQL语法解释器jsqlparser 是用java开发的解析器,可以生成java类层次结构. 主页地址:http://jsqlparser.sourceforge.net 可以完美解析表的增删查 ...

  8. Java学习、面试、求职、干货资源精品合集

    本系列文章整合了本号发表和转载过的,有关Java学习.进阶.面试.做项目.求职经验等方面的文章,希望对想要找工作,以及正在找工作的你,能够有所帮助. 原创Java学习专题文章: 如何才能够系统地学习J ...

  9. 【Pytest】python单元测试框架pytest简介

    1.Pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍 ...

  10. ICMP(Internet Control Message Protocol)网际控制报文协议初识

    ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网 ...