个人总结:如何保证消息的顺序性和分布式的本质?

环境

MacBook Pro

前言

今天读了如下文章,产生了一些感想和总结;
https://doocs.github.io/advanced-java/#/./docs/high-concurrency/how-to-ensure-the-order-of-messages

如何保证消息的顺序性

对顺序有严格要求的话,真正能保证顺序的是一个队列让一个线程去消费。
而且还必须保证数据足够分散。不然都跑到一个队列里,一个线程来消费的话,
这样吞吐量就很小。

而如何去分散数据到不同的队列中得根据具体业务来。

拿股票来说,委托为 股票、期货,这种就没必要公用一个队列(queue)了,而是股票一个队列、期货一个队列。当然这个例子并不好,因为即使股票是一个队列,假设有100万股民在同时交易,一个线程也处理不及时。所以得进一步去细分,比如按IP地址来细分,华北和华南在细分一下。

​反正永远要记住,多线程执行,你不知道哪个线程先执行,哪个后执行。所以对于有顺序要求的消息来说,一定是一个线程去消费一个队列。而我们需要做的就是让队列的数据量都很均匀。也就是要不断细分,直到系统能承受为止。

分布式的本质

分布式就是看 数据是不是足够分散~

集群模式的分散:一份数据,多个节点都有,并且拥有的都是完整的数据;

好处:是有利于读写分离,主节点写,从节点读。

坏处:①网络开销非常大,因为主节点修改后,都得同步给从节点,而从节点可能有10个,100个,1000个。② 当数据量超过了单个节点的承受能力时,这时,你加机器做水平扩展也没用。


好的分布式应该是:一份数据存在多个机器上,每个机器只存部分数据 – 其实就是分片.

上面的分片只是解决了分散的问题,假设有三台机器,其中一台挂了,就会导致数据丢失,

所以还需要有replica(副本集),对每个分片进行备份;

当有这么多副本集后,又会有新的问题,那就是哪个节点谁来做老大(leader)呢?总不能随机吧(计算机真的有随机吗?只不过是个超大型的循环罢了

主流的做法:在多个副本集中选举出一个leader。读写都由这个节点负责,为啥呢?为了确保数据的一致性,因为当写入数据时,需要同步到相应的follower节点上,这个过程是需要时间。

当然如果,我们希望分布式集群就是可用性高于一致性的话,那么也可以主节点写,follower从节点读。

参考地址:https://doocs.github.io/advanced-java/#/./docs/high-concurrency/how-to-ensure-high-availability-of-message-queues

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值