Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
advanced-java
提交
2c941879
A
advanced-java
项目概览
wushizhenking
/
advanced-java
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
advanced-java
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2c941879
编写于
10月 09, 2018
作者:
Y
yanglbme
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add how-to-ensure-the-order-of-messages.md
上级
32d6e264
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
33 addition
and
3 deletion
+33
-3
README.md
README.md
+3
-3
docs/high-concurrency/how-to-ensure-the-order-of-messages.md
docs/high-concurrency/how-to-ensure-the-order-of-messages.md
+30
-0
未找到文件。
README.md
浏览文件 @
2c941879
# Java 进阶知识
总结
# Java 进阶知识
学习
[
![license
](
https://img.shields.io/badge/license-Attribution--NonCommercial%204.0%20-brightgreen.svg
)
](https://github.com/doocs/advanced-java/blob/master/LICENSE)
[
![license
](
https://img.shields.io/badge/license-Attribution--NonCommercial%204.0%20-brightgreen.svg
)
](https://github.com/doocs/advanced-java/blob/master/LICENSE)
[
![original
](
https://img.shields.io/badge/original-
shishan
-blue.svg
)
](https://github.com/doocs/advanced-java)
[
![original
](
https://img.shields.io/badge/original-
%E4%B8%AD%E5%8D%8E%E7%9F%B3%E6%9D%89
-blue.svg
)
](https://github.com/doocs/advanced-java)
[
![PRs Welcome
](
https://img.shields.io/badge/PRs-Welcome-brightgreen.svg
)
](http://makeapullrequest.com)
[
![PRs Welcome
](
https://img.shields.io/badge/PRs-Welcome-brightgreen.svg
)
](http://makeapullrequest.com)
## 分布式系统
## 分布式系统
...
@@ -47,7 +47,7 @@
...
@@ -47,7 +47,7 @@
-
[
如何保证消息队列的高可用?
](
/docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md
)
-
[
如何保证消息队列的高可用?
](
/docs/high-concurrency/how-to-ensure-high-availability-of-message-queues.md
)
-
[
如何保证消息不被重复消费?(如何保证消息消费时的幂等性)
](
/docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md
)
-
[
如何保证消息不被重复消费?(如何保证消息消费时的幂等性)
](
/docs/high-concurrency/how-to-ensure-that-messages-are-not-repeatedly-consumed.md
)
-
[
如何保证消息的可靠性传输?(如何处理消息丢失的问题)
](
/docs/high-concurrency/how-to-ensure-the-reliable-transmission-of-messages.md
)
-
[
如何保证消息的可靠性传输?(如何处理消息丢失的问题)
](
/docs/high-concurrency/how-to-ensure-the-reliable-transmission-of-messages.md
)
-
如何保证消息的顺序性?
-
[
如何保证消息的顺序性?
](
/docs/high-concurrency/how-to-ensure-the-order-of-messages.md
)
-
如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
-
如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
-
如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路。
-
如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路。
...
...
docs/high-concurrency/how-to-ensure-the-order-of-messages.md
0 → 100644
浏览文件 @
2c941879
## 面试题
如何保证消息的顺序性?
## 面试官心理分析
其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。
## 面试题剖析
我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿。mysql -> mysql,常见的一点在于说大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂的操作。
你在 mysql 里增删改一条数据,对应出来了增删改 3 条
`binlog`
,接着这三条
`binlog`
发送到 MQ 里面,到消费出来依次执行,起码得保证人家是按照顺序来的吧?不然本来是:增加、修改、删除;你楞是换了顺序给执行成删除、修改、增加,不全错了么。
本来这个数据同步过来,应该最后这个数据被删除了;结果你搞错了这个顺序,最后这个数据保留下来了,数据同步就出错了。
先看看顺序会错乱的俩场景:
-
RabbitMQ:一个 queue,多个 consumer,这不明显乱了;
![
rabbitmq-order-1
](
http://paver62xl.bkt.clouddn.com/rabbitmq-order-1.png
)
-
kafka:一个 topic,一个 partition,一个 consumer,内部多线程,这不也明显乱了。
![
kafka-order-1
](
http://paver62xl.bkt.clouddn.com/kafka-order-1.png
)
### 解决方案
#### RabbitMQ
拆分多个 queue,每个 queue 一个 consumer,就是多一些 queue 而已,确实是麻烦点;或者就一个 queue 但是对应一个 consumer,然后这个 consumer 内部用内存队列做排队,然后分发给底层不同的 worker 来处理。
![
rabbitmq-order-2
](
http://paver62xl.bkt.clouddn.com/rabbitmq-order-2.png
)
#### kafka
一个 topic,一个 partition,一个 consumer,内部单线程消费;写 N 个内存 queue,然后 N 个线程分别消费一个内存 queue 即可。
![
kafka-order-2
](
http://paver62xl.bkt.clouddn.com/kafka-order-2.png
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录