环境
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
从节点读。