-
Notifications
You must be signed in to change notification settings - Fork 0
/
15625659827923.html
404 lines (238 loc) · 13.4 KB
/
15625659827923.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>
RocketMQ概览 - lazyfighter.com
</title>
<link href="atom.xml" rel="alternate" title="lazyfighter.com" type="application/atom+xml">
<link rel="stylesheet" href="asset/css/foundation.min.css" />
<link rel="stylesheet" href="asset/css/docs.css" />
<script src="asset/js/vendor/modernizr.js"></script>
<script src="asset/js/vendor/jquery.js"></script>
<script src="asset/highlightjs/highlight.pack.js"></script>
<link href="asset/highlightjs/styles/github.css" media="screen, projection" rel="stylesheet" type="text/css">
<script>hljs.initHighlightingOnLoad();</script>
<script type="text/javascript">
function before_search(){
var searchVal = 'site: ' + document.getElementById('search_input').value;
document.getElementById('search_q').value = searchVal;
return true;
}
</script>
</head>
<body class="antialiased hide-extras">
<div class="marketing off-canvas-wrap" data-offcanvas>
<div class="inner-wrap">
<nav class="top-bar docs-bar hide-for-small" data-topbar>
<section class="top-bar-section">
<div class="row">
<div style="position: relative;width:100%;"><div style="position: absolute; width:100%;">
<ul id="main-menu" class="left">
<li id=""><a target="self" href="index.html">Home</a></li>
<li id=""><a target="_self" href="archives.html">Archives</a></li>
</ul>
<ul class="right" id="search-wrap">
<li>
<form target="_blank" onsubmit="return before_search();" action="https://google.com/search" method="get">
<input type="hidden" id="search_q" name="q" value="" />
<input tabindex="1" type="search" id="search_input" placeholder="Search"/>
</form>
</li>
</ul>
</div></div>
</div>
</section>
</nav>
<nav class="tab-bar show-for-small">
<a href="javascript:void(0)" class="left-off-canvas-toggle menu-icon">
<span> lazyfighter.com</span>
</a>
</nav>
<aside class="left-off-canvas-menu">
<ul class="off-canvas-list">
<li><a target="self" href="index.html">Home</a></li>
<li><a target="_self" href="archives.html">Archives</a></li>
<li><label>Categories</label></li>
<li><a href="spring.html">spring</a></li>
<li><a href="apache-dubbo.html">apache-dubbo</a></li>
<li><a href="Java%E7%BC%96%E7%A8%8B%E5%8F%91%E6%94%BE%E8%AE%BA%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0.html">Java编程发放论读书笔记</a></li>
<li><a href="netty.html">netty</a></li>
<li><a href="rocketmq.html">rocketmq</a></li>
<li><a href="apache-camel.html">apache-camel</a></li>
<li><a href="sofa-rpc.html">sofa-rpc</a></li>
<li><a href="java.html">java</a></li>
<li><a href="sentinel.html">sentinel</a></li>
<li><a href="react.html">react</a></li>
</ul>
</aside>
<a class="exit-off-canvas" href="#"></a>
<section id="main-content" role="main" class="scroll-container">
<script type="text/javascript">
$(function(){
$('#menu_item_index').addClass('is_active');
});
</script>
<div class="row">
<div class="large-8 medium-8 columns">
<div class="markdown-body article-wrap">
<div class="article">
<h1>RocketMQ概览</h1>
<div class="read-more clearfix">
<span class="date">2019/7/8</span>
<span>posted in </span>
<span class="posted-in"><a href='rocketmq.html'>rocketmq</a></span>
<span class="comments">
</span>
</div>
</div><!-- article -->
<div class="article-content">
<p>RocketMQ基于主体的发布订阅模式,核心功能包括: 消息发送、消息存储Broker、消息消费。</p>
<p><strong>自研NameServer充当注册中心</strong>,实现元数据管理(Tocpic路由信息等),Topic路由信息无须再集群之间保持强一致,追求最终一致性,能够容忍分钟级的不一致。基于此,NameServer之间不会互相通信因此对网络的要求降低了,同时对比zk性能也有很大的提升。</p>
<p><strong>高效的IO存储机制</strong>RocketMQ准求消息发送的高吞吐量,存储文件设计成文件组的概念,组内单个文件大小固定,方便内存映射机制,所有的消息存储基于顺序写,极大的提供了消息的写性能,同时兼容消息消费查找,引入消息消费队列文件和索引文件。</p>
<p><strong>适当将某些工作下发给RocketMQ使用者</strong>我们进场会遇到类似的问题,如何确保消息一定被消费,并且只保证消息消费一次。RocketMQ在设计实现中,只会保证消息被消费者消费但不会保证只消费一次,将不重复消费下发给使用者自行解决,因此设计起来简单高效。</p>
<span id="more"></span><!-- more -->
<h2 id="toc_0">RocketMQ源码结构</h2>
<p><img src="media/15625659827923/15625666107663.jpg" alt=""/></p>
<ul>
<li>borker: borker模块(borker启动进程)</li>
<li>client: 消息客户端,包含消息生产者、消息消费者相关类</li>
<li>common: 公共包</li>
<li>dev: 开发者信息</li>
<li>distribution: 部署实例文件件</li>
<li>example: RocketMQ示例代码</li>
<li>filter: 消息过滤相关基础类</li>
<li>filtersrv: 消息过滤服务器实现相关类(Filter启动进程)</li>
<li>logappender: 日志相关实现类</li>
<li>namesrv: NameServer实现相关类(NameServer启动进程)</li>
<li>openmessaging: 消息开放标准</li>
<li>remoting: 远程通信模块,基于netty</li>
<li>srvutil: 服务器工具类</li>
<li>store: 消息存储实现相关类</li>
<li>style: checkstyle实现相关类</li>
<li>test: 测试相关类</li>
<li>tools: 工具类,监控命令相关实现类</li>
</ul>
<h2 id="toc_1">设计目标</h2>
<ol>
<li><strong>架构模式,采用发布订阅模式</strong>,主要组件包含: 消息发送者、消息服务器(存储消息)、消息消费、路由发现。</li>
<li><strong>顺序消息</strong>, 严格保证消息有序</li>
<li>消息过滤, 支持<strong>服务端客户端过滤</strong>,服务端过滤只将客户端感兴趣的消息推送给消费者,客户端过滤会有无用消息。</li>
<li>消息存储, 消息存储有两个维度的考量,消息堆积能力以及消息存储性能,RocketMQ追求消息<strong>存储的高性能</strong>,引入内存映射机制,所有主题的消息顺序存储在一个文件中,同时为了避免消息在存储服务器中累计,引入消息文件过期机智与文件存储空间报警。</li>
<li><strong>消息高可用</strong>, 针对Broker正常关机、Broker异常Crash、OS Crash、机器断电但是能立即回复供电的情况RocketMQ在同步刷盘的情况下可以保证不丢失消息,在异步刷盘的情况下会丢失少量消息。针对机器无法开机、磁盘设备损坏一旦发生消息将全部丢失,如果开启了异步复制机制,保证之丢失少量消息,同时后续会引入双写机制保证消息可靠性极高的场景。</li>
<li><strong>消息消费低延迟</strong>, 保证在不发生消息堆积的时候,以长轮序模式实现准实时的消息推送模式。</li>
<li><strong>确保消息必须被消费一次</strong>, 通过消息的ACK机制保证消息至少被消费一次,但由于ACK可能会丢失无法做到只消费一次,有重复消费的可能。</li>
<li><strong>回溯消息</strong>, 回溯消息是指消息消费端已经消费成功的消息,由于业务要求需要重新消费RocketMQ支持按时间回溯消息,时间维度可以精确到毫秒,可以向前或者向后回溯。</li>
<li><strong>消息堆积</strong>,RocketMQ消息存储采用磁盘文件内存映射机智,并且在物理布局上位多个大小相等的文件组成逻辑文件组,可以无限循环使用。RocketMQ消息存储文件并不是永久存储在消息服务端,而是提供了默认过期机制,默认保留3天。</li>
<li><strong>定时消息</strong>, 支持特定延迟级别。</li>
<li><strong>消息重试机制</strong>,消息重试是指消息在消费时,如果发送异常,消息中间件需要支持消息重新投递,RocketMQ支持消息重试机制。</li>
</ol>
</div>
<div class="row">
<div class="large-6 columns">
<p class="text-left" style="padding:15px 0px;">
<a href="15625684305136.html"
title="Previous Post: 路由中心NameServer">« 路由中心NameServer</a>
</p>
</div>
<div class="large-6 columns">
<p class="text-right" style="padding:15px 0px;">
<a href="15621422737770.html"
title="Next Post: 通过消息头中定义长度字段来标识消息的总长度">通过消息头中定义长度字段来标识消息的总长度 »</a>
</p>
</div>
</div>
<div class="comments-wrap">
<div class="share-comments">
</div>
</div>
</div><!-- article-wrap -->
</div><!-- large 8 -->
<div class="large-4 medium-4 columns">
<div class="hide-for-small">
<div id="sidebar" class="sidebar">
<div id="site-info" class="site-info">
<div class="site-a-logo"><img src="https://pic.wenwen.soso.com/p/20141016/20141016170205-https://pic.wenwen.soso.com/p/20141016/20141016170205-1919883500.jpg" /></div>
<h1>lazyfighter.com</h1>
<div class="site-des"></div>
<div class="social">
<a target="_blank" class="github" target="_blank" href="https://github.com/lazyfighter" title="GitHub">GitHub</a>
<a target="_blank" class="email" href="mailto:[email protected]" title="Email">Email</a>
<a target="_blank" class="rss" href="atom.xml" title="RSS">RSS</a>
</div>
</div>
<div id="site-categories" class="side-item ">
<div class="side-header">
<h2>Categories</h2>
</div>
<div class="side-content">
<p class="cat-list">
<a href="spring.html"><strong>spring</strong></a>
<a href="apache-dubbo.html"><strong>apache-dubbo</strong></a>
<a href="Java%E7%BC%96%E7%A8%8B%E5%8F%91%E6%94%BE%E8%AE%BA%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0.html"><strong>Java编程发放论读书笔记</strong></a>
<a href="netty.html"><strong>netty</strong></a>
<a href="rocketmq.html"><strong>rocketmq</strong></a>
<a href="apache-camel.html"><strong>apache-camel</strong></a>
<a href="sofa-rpc.html"><strong>sofa-rpc</strong></a>
<a href="java.html"><strong>java</strong></a>
<a href="sentinel.html"><strong>sentinel</strong></a>
<a href="react.html"><strong>react</strong></a>
</p>
</div>
</div>
<div id="site-categories" class="side-item">
<div class="side-header">
<h2>Recent Posts</h2>
</div>
<div class="side-content">
<ul class="posts-list">
<li class="post">
<a href="15625738990440.html">Broker启动流程</a>
</li>
<li class="post">
<a href="15625684305136.html">路由中心NameServer</a>
</li>
<li class="post">
<a href="15625659827923.html">RocketMQ概览</a>
</li>
<li class="post">
<a href="15621422737770.html">通过消息头中定义长度字段来标识消息的总长度</a>
</li>
<li class="post">
<a href="15620535102889.html">第1章 响应式编程总览</a>
</li>
</ul>
</div>
</div>
</div><!-- sidebar -->
</div><!-- hide for small -->
</div><!-- large 4 -->
</div><!-- row -->
<div class="page-bottom clearfix">
<div class="row">
<p class="copyright">Copyright © 2015
Powered by <a target="_blank" href="http://www.mweb.im">MWeb</a>,
Theme used <a target="_blank" href="http://github.com">GitHub CSS</a>.</p>
</div>
</div>
</section>
</div>
</div>
<script src="asset/js/foundation.min.js"></script>
<script>
$(document).foundation();
function fixSidebarHeight(){
var w1 = $('.markdown-body').height();
var w2 = $('#sidebar').height();
if (w1 > w2) { $('#sidebar').height(w1); };
}
$(function(){
fixSidebarHeight();
})
$(window).load(function(){
fixSidebarHeight();
});
</script>
</body>
</html>