
中间件
文章平均质量分 82
Please Sit Down
Fake it,until make it!
展开
-
如何保证消息的顺序性?
举个例子,我们以前做过一个 mysqlbinlog同步的系统,压力还是非常大的,日同步数据 要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务 系统的数据做各种复杂的操作。你在 mysql 里增删改一条数据,对应出来了增删改 3 条binlog日志,接着这三条binlog。转载 2023-07-03 16:55:04 · 145 阅读 · 0 评论 -
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?
这个是肯定的,用 MQ 有个基本原则,就是,不能多,就是 前面说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考 虑一下。如果说你这个是用 MQ 来传递非常核心的消息,比如说计费、扣费的一些消息,那必须确保这 个 MQ 传递过程中。数据的丢失问题,可能出现在生产者、MQ、消费者中,咱们从 RabbitMQ 和 Kafka 分别来分析 一下吧。转载 2023-07-03 16:48:06 · 272 阅读 · 0 评论 -
如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
但是凡事总有意外,比如我们之前生产经常遇到的,就是你有时候重启系统,看你怎么重启 了,如果碰到点着急的,直接 kill 进程了,再重启。但是你要是消费到第二次的时候,自己判断一 下是否已经消费过了,若是就直接扔了,这样不就保留了一条数据,从而保证了数据的正确 性。,会把自己消费过的消息的offset提交一下,表示“我已经消费过了,下次我要是重启啥的,你就让我继续从上次消费到的offset来继续消费吧”。幂等性,通俗点说,就一个数据,或者一个请求,给你重复来多次,你得确保对应的数据是不 会改变的,不能出错。转载 2023-07-03 16:11:53 · 163 阅读 · 0 评论 -
如何保证消息队列的高可用?
跟普通集群模式不一样的是,在镜像集群模 式下,你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,就是说, 每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据的意思。其实很简单,RabbitMQ 有很好的管理控制台,就是在后 台新增一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有 节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自 动将数据同步到其他的节点上去了。转载 2023-07-03 15:58:54 · 118 阅读 · 0 评论 -
为什么使用消息队列?消息队列有什么优点和缺点?常用的MQ 都有什么区别,以及适合哪些场景?
通过一个 MQ,Pub/Sub 发布订阅消息这么一个模型,A 系统就跟其它系统彻底解耦了。转载 2023-07-03 14:53:39 · 171 阅读 · 0 评论 -
分库分表之后,id 主键如何处理?
其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后, 每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持。所以这都是你实 际生产环境中必须考虑的问题。转载 2023-06-29 15:25:05 · 134 阅读 · 0 评论 -
如何设计可以动态扩容缩容的分库分表方案?
这个是你必须面对的一个事儿,就是你已经弄好分库分表方案了,然后一堆库和表都建好了, 基于分库分表中间件的代码开发啥的都好了,测试都 ok 了,数据能均匀分布到各个库和各个 表里去,而且接着你还通过双写的方案咔嚓一下上了系统,已经直接基于分库分表方案在搞 了。那么现在问题来了,你现在这些库和表又支撑不住了,要继续扩容咋办?这个可能就是说你的 每个库的容量又快满了,或者是你的表数据量又太大了,也可能是你每个库的写并发太高了, 你得继续扩容。这都是玩儿分库分表线上必须经历的事儿。转载 2023-06-29 14:45:53 · 304 阅读 · 0 评论 -
现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上?
最 low 的方案,就是很简单,大家伙儿凌晨 12 点开始运维,网站或者 app 挂 个公告,说 0 点到早上 6 点进行运维,无法访问。接着到 0 点停机,系统停掉,没有流量写入了,此时老的单库单表数据库静止了。然后你之前 得写好一个,此时直接跑起来,然后将单库单表的数据哗哗哗读出来,写 到分库分表里面去。导数完了之后,就 ok 了,修改系统的数据库连接配置啥的,包括可能代码和 SQL 也许有修 改,那你就用最新的代码,然后直接启动连到新的分库分表上去。转载 2023-06-29 14:30:42 · 156 阅读 · 0 评论 -
如何对数据库进行垂直拆分或水平拆分?
分表,你考虑一下,你如果哪 怕是拆到每个库里去,并发和容量都 ok 了,但是每个库的表还是太大了,那么你就分表,将 这个表分开,保证每个表的数据量并不是很大。的意思,就是把一个表的数据给弄到多个库的多个表里去,但是每个库的表结构都一 样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据。range 来分,好处在于说,扩容的时候很简单,因为你只要预备好,给每个月都准备一个库就 可以了,到了一个新的月份的时候,自然而然,就会写新的库了;缺点,但是大部分的请求, 都是访问最新的数据。转载 2023-06-29 11:35:22 · 221 阅读 · 0 评论 -
常用的分库分表中间件
综上,现在其实建议考量的,就是 Sharding-jdbc 和 Mycat,这两个都可以去考虑使用。Sharding-jdbc 这种 client 层方案的优点在于不用部署,运维成本低,不需要代理层的二次 转发请求,性能很高,但是如果遇到升级啥的需要各个系统都重新升级版本再发布,各个系 统都需要耦合 Sharding-jdbc 的依赖;Mycat 这种 proxy 层方案的缺点在于需要部署,自己运维一套中间件,运维成本高,但是好处 在于对于各个项目是透明的,如果遇到升级之类的都是自己中间件那里搞就行了。转载 2023-06-29 11:30:57 · 745 阅读 · 0 评论