-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
710 lines (440 loc) · 61.9 KB
/
atom.xml
File metadata and controls
710 lines (440 loc) · 61.9 KB
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
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>探索数据之美</title>
<icon>http://www.typedefine.cn/icon.png</icon>
<subtitle>不忘初心,砥砺前行!</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://www.typedefine.cn/"/>
<updated>2021-09-19T02:33:45.000Z</updated>
<id>http://www.typedefine.cn/</id>
<author>
<name>山野@成都</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>一家估值1.75 亿美金的公司是如何被一行 Python代码给毁掉的</title>
<link href="http://www.typedefine.cn/2021/09/19/digg-python/"/>
<id>http://www.typedefine.cn/2021/09/19/digg-python/</id>
<published>2021-09-19T02:33:45.000Z</published>
<updated>2021-09-19T02:33:45.000Z</updated>
<summary type="html">
<img src="/2021/09/19/digg-python/0.jpg" class="" title>
<p>先分享一篇文章,这是我在几年前阅读过的文章,原文在elthain.com网站上。后被网友在v2ex网站上分享。大概的故事是这样的:</p>
<h1 id="一行代码引发的惨案"><a href="#一行代码引发的惨案" class="headerlink" title="一行代码引发的惨案"></a>一行代码引发的惨案</h1><p>2011 年,Google 推出「 Panda 」机制动摇了很多老的 SEO 手段,digg 流量被腰斩。推出 DiggV4 作战计划。经过紧张的开发发布,不过访客页面没问题,已登录用户打不开 MyNews 页面。开发不得不用临时手段把登录用户的默认页面改成 TopNews。MyNews 只能通过不断重启进程才能短暂修复。初期以为是 cassandra 的缓存击穿了 memcache,后来加紧用 redis 重写了,还是得每4个小时重启一次进程。</p>
<p>(折腾了一个月之后)</p>
</summary>
<category term="商业" scheme="http://www.typedefine.cn/categories/%E5%95%86%E4%B8%9A/"/>
<category term="Python" scheme="http://www.typedefine.cn/categories/%E5%95%86%E4%B8%9A/Python/"/>
<category term="新媒体" scheme="http://www.typedefine.cn/categories/%E5%95%86%E4%B8%9A/Python/%E6%96%B0%E5%AA%92%E4%BD%93/"/>
<category term="商业" scheme="http://www.typedefine.cn/tags/%E5%95%86%E4%B8%9A/"/>
<category term="Python" scheme="http://www.typedefine.cn/tags/Python/"/>
<category term="新媒体" scheme="http://www.typedefine.cn/tags/%E6%96%B0%E5%AA%92%E4%BD%93/"/>
</entry>
<entry>
<title>如何降低MongoDB的使用内存</title>
<link href="http://www.typedefine.cn/2021/07/28/%E5%A6%82%E4%BD%95%E9%99%8D%E4%BD%8EMongoDB%E7%9A%84%E4%BD%BF%E7%94%A8%E5%86%85%E5%AD%98/"/>
<id>http://www.typedefine.cn/2021/07/28/%E5%A6%82%E4%BD%95%E9%99%8D%E4%BD%8EMongoDB%E7%9A%84%E4%BD%BF%E7%94%A8%E5%86%85%E5%AD%98/</id>
<published>2021-07-28T08:17:34.000Z</published>
<updated>2021-07-28T08:17:34.000Z</updated>
<summary type="html">
<p>在我们的系统中部署了很多套MongoDB的集群,但是有的时候会发现MongoDB启动不起来,或者启动之后一会儿MongoDB实例就挂了,也不知道是什么原因。我们按照如下方式进行了排查:</p>
<ol>
<li>检查所在宿主OS中MongoDB的存储磁盘空间是否足够<img src="/2021/07/28/%E5%A6%82%E4%BD%95%E9%99%8D%E4%BD%8EMongoDB%E7%9A%84%E4%BD%BF%E7%94%A8%E5%86%85%E5%AD%98/B7B7DFDD-DF85-41ea-A9B4-3A583BACBA59.png" class="" title></li>
<li>检查所在宿主OS中的空闲内存是否足够<br>使用命令free -h或者用命令top也可以</li>
<li>检查MongoDB的运行日志<img src="/2021/07/28/%E5%A6%82%E4%BD%95%E9%99%8D%E4%BD%8EMongoDB%E7%9A%84%E4%BD%BF%E7%94%A8%E5%86%85%E5%AD%98/FBB27F6E-B5A1-4e0e-B30C-85FF768FB6BB.png" class="" title></li>
<li>通过top -p pid命令跟踪进程的内存占用<img src="/2021/07/28/%E5%A6%82%E4%BD%95%E9%99%8D%E4%BD%8EMongoDB%E7%9A%84%E4%BD%BF%E7%94%A8%E5%86%85%E5%AD%98/598ACA72-0B06-4b76-90B5-C5B395E4677D.png" class="" title>
发现进程突然被kill掉。怀疑这时是因为进程的内存增长过快导致<sup id="fnref:2"><a href="#fn:2" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="[OOM Killer](https://blog.csdn.net/w635614017/article/details/89204253?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control)
">[2]</span></a></sup>。
</summary>
<category term="MongoDB" scheme="http://www.typedefine.cn/categories/MongoDB/"/>
<category term="系统分析" scheme="http://www.typedefine.cn/categories/MongoDB/%E7%B3%BB%E7%BB%9F%E5%88%86%E6%9E%90/"/>
<category term="MongoDB" scheme="http://www.typedefine.cn/tags/MongoDB/"/>
<category term="OOM" scheme="http://www.typedefine.cn/tags/OOM/"/>
<category term="systemd" scheme="http://www.typedefine.cn/tags/systemd/"/>
</entry>
<entry>
<title>如何设计一个标签系统?</title>
<link href="http://www.typedefine.cn/2021/07/27/%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E6%A0%87%E7%AD%BE%E7%B3%BB%E7%BB%9F%EF%BC%9F/"/>
<id>http://www.typedefine.cn/2021/07/27/%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E6%A0%87%E7%AD%BE%E7%B3%BB%E7%BB%9F%EF%BC%9F/</id>
<published>2021-07-27T08:27:06.000Z</published>
<updated>2021-07-27T08:27:06.000Z</updated>
<summary type="html">
<p>在很多系统中都有打标签的需求,比如图片、书籍、电影、博客、评论等,并且打标签的对象往往是海量数据。这就给系统的设计提出了挑战:</p>
<ul>
<li>要求可以根据标签进行分组、过滤、协同查询(比如标签的并集、交集、差集等等)</li>
<li>要求查询的效率很高</li>
<li>要求整个标签系统的扩展性很强</li>
</ul>
</summary>
<category term="系统设计" scheme="http://www.typedefine.cn/categories/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/"/>
<category term="标签" scheme="http://www.typedefine.cn/tags/%E6%A0%87%E7%AD%BE/"/>
</entry>
<entry>
<title>Maven配置部署指北</title>
<link href="http://www.typedefine.cn/2021/03/29/Maven%E9%85%8D%E7%BD%AE%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8C%97/"/>
<id>http://www.typedefine.cn/2021/03/29/Maven%E9%85%8D%E7%BD%AE%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8C%97/</id>
<published>2021-03-29T08:50:12.000Z</published>
<updated>2021-03-29T08:50:12.000Z</updated>
<summary type="html">
<h1 id="Snapshots和release仓库"><a href="#Snapshots和release仓库" class="headerlink" title="Snapshots和release仓库"></a>Snapshots和release仓库</h1><h2 id="二者区别是什么"><a href="#二者区别是什么" class="headerlink" title="二者区别是什么"></a>二者区别是什么</h2><p>Snapshot<sup id="fnref:2"><a href="#fn:2" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="[Maven快照](https://www.runoob.com/maven/maven-snapshots.html)
">[2]</span></a></sup>,快照,是一种特殊的版本,指定了某个当前的开发进度的副本。不同于常规的版本,Maven 每次构建都会在远程仓库中检查新的快照。比如发布了一个app-1.0-SNAPSHOT版本,那么maven构件的时候,每次都会去仓库检查是否有最新的版本已经被发布。如果有,则替换。如果是release仓库,那么除非版本升级,否则maven构件的时候不会去检查最新的jar包,即便是在nexus仓库中已经更新了。</p>
<p>maven中的仓库分为两种<sup id="fnref:3"><a href="#fn:3" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="[maven快照版本和发布版本](https://www.cnblogs.com/wuchanming/p/5484091.html)
">[3]</span></a></sup>,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本。</p>
<p>定义一个组件/模块为快照版本,只需要在pom文件中在该模块的版本号后加上-SNAPSHOT即可(注意这里必须是大写),如下:</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.schdri<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>bimgis<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">version</span>&gt;</span>3.10.0-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">name</span>&gt;</span>$&#123;project.artifactId&#125;<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">packaging</span>&gt;</span>pom<span class="tag">&lt;/<span class="name">packaging</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">organization</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">name</span>&gt;</span>pig4cloud<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line"> <span class="tag">&lt;<span class="name">url</span>&gt;</span>https://www.pig4cloud.com<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">organization</span>&gt;</span></span><br></pre></td></tr></table></figure>
</summary>
<category term="Maven" scheme="http://www.typedefine.cn/categories/Maven/"/>
<category term="DevOps" scheme="http://www.typedefine.cn/categories/Maven/DevOps/"/>
<category term="Maven" scheme="http://www.typedefine.cn/tags/Maven/"/>
<category term="DevOps" scheme="http://www.typedefine.cn/tags/DevOps/"/>
</entry>
<entry>
<title>SQL建模规范</title>
<link href="http://www.typedefine.cn/2021/03/29/SQL%E5%BB%BA%E6%A8%A1%E8%A7%84%E8%8C%83/"/>
<id>http://www.typedefine.cn/2021/03/29/SQL%E5%BB%BA%E6%A8%A1%E8%A7%84%E8%8C%83/</id>
<published>2021-03-29T01:39:50.000Z</published>
<updated>2021-03-29T01:39:50.000Z</updated>
<summary type="html">
<h1 id="建模原则"><a href="#建模原则" class="headerlink" title="建模原则"></a>建模原则</h1><ol>
<li><p>数据库字段小写,下划线连接;每个字段都需要由COMMENT,说明其业务含义。</p>
</li>
<li><p>使用id作为主键,建议类型为bigint(20), 其对应的java类型为Long。</p>
<ul>
<li>Mybatis Plus框架自动生成主键插入(雪花算法)</li>
<li>也可以使用数据库自增,当只有1个服务,数据量较小的时候建议选择,提升插入性能。</li>
</ul>
</li>
<li><p>update_time、create_time<br>使用timestamp或者datetime作为时间类型的首选。Mybatis-Plus框架生成的相应Java类型都是LocalDateTime。大部分场景下2种类型可以互相替换,不过在时间范围和时区支持上有差异。<br>使用MySQL的自动初始化和自动更新功能。 字段变化之后,update_time数据库自动更新,如下:</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">create_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP <span class="keyword">COMMENT</span> <span class="string">'创建时间'</span>,</span><br><span class="line">create_by <span class="built_in">varchar</span>(<span class="number">36</span>) <span class="keyword">DEFAULT</span> <span class="literal">NULL</span> <span class="keyword">COMMENT</span> <span class="string">'创建人'</span>,</span><br><span class="line">update_at <span class="built_in">timestamp</span> <span class="keyword">NOT</span> <span class="literal">NULL</span> <span class="keyword">DEFAULT</span> <span class="keyword">CURRENT_TIMESTAMP</span> <span class="keyword">ON</span> <span class="keyword">UPDATE</span> <span class="keyword">CURRENT_TIMESTAMP</span> <span class="keyword">COMMENT</span> <span class="string">'更新时间'</span>,</span><br><span class="line">update_by <span class="built_in">varchar</span>(<span class="number">36</span>) <span class="keyword">DEFAULT</span> <span class="literal">NULL</span> <span class="keyword">COMMENT</span> <span class="string">'更新人'</span>,</span><br></pre></td></tr></table></figure>
</li>
<li><p>布尔型字段使用tinyint(1)即可。</p>
</li>
<li><p>参考《阿里巴巴Java开发手册(华山版).pdf》。</p>
</li>
</ol>
<h1 id="雪花算法实现"><a href="#雪花算法实现" class="headerlink" title="雪花算法实现"></a>雪花算法实现</h1>
</summary>
<category term="SQL" scheme="http://www.typedefine.cn/categories/SQL/"/>
<category term="建模" scheme="http://www.typedefine.cn/categories/SQL/%E5%BB%BA%E6%A8%A1/"/>
<category term="数据库" scheme="http://www.typedefine.cn/categories/SQL/%E5%BB%BA%E6%A8%A1/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
<category term="建模" scheme="http://www.typedefine.cn/tags/%E5%BB%BA%E6%A8%A1/"/>
<category term="SQL" scheme="http://www.typedefine.cn/tags/SQL/"/>
<category term="数据库" scheme="http://www.typedefine.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
</entry>
<entry>
<title>Spring Cloud支持MongoDB</title>
<link href="http://www.typedefine.cn/2020/12/07/%E5%A6%82%E4%BD%95%E5%9C%A8Spring-Cloud%E6%9C%8D%E5%8A%A1%E4%B8%AD%E9%85%8D%E7%BD%AEMongoDB/"/>
<id>http://www.typedefine.cn/2020/12/07/%E5%A6%82%E4%BD%95%E5%9C%A8Spring-Cloud%E6%9C%8D%E5%8A%A1%E4%B8%AD%E9%85%8D%E7%BD%AEMongoDB/</id>
<published>2020-12-07T07:09:46.000Z</published>
<updated>2020-12-07T07:09:46.000Z</updated>
<summary type="html">
<p>MongoDB无疑是当前在各个领域中NoSQL优选的文档数据库之一。原因在于部署简单,可扩展性强,原生支持javascript脚本编程。对于使用Spring全家桶的团队来说,是一个很好的选择,可以快速的搭建一个服务出来。如果是用JS或者Typescript语言的话,使用mongoose的ORM框架结合到express框架,生产力会提高一大截。</p>
<p>稍显不足的是,MongoDB对于中文索引支持的力度不够,对于某些要求强事务的领域应用(比如金融、财务等)略显不足,至少还没有看到有成熟应用的案例。如果有,请告诉我。另外一个就是,在搭建MongoDB集群的时候,相对来说是比较复杂的。水平扩展虽然很简单,但是做Sharding的时候也需要仔细的考量。</p>
<p>本文简单介绍一下如何在Spring Boot/Spring Cloud程序中使用MongoDB数据库。</p>
<h1 id="Java-Config"><a href="#Java-Config" class="headerlink" title="Java Config"></a>Java Config</h1><p>第一种方式就是采用Java Config的方式,直接上代码,如下:</p>
</summary>
<category term="架构" scheme="http://www.typedefine.cn/categories/%E6%9E%B6%E6%9E%84/"/>
<category term="MongoDB" scheme="http://www.typedefine.cn/tags/MongoDB/"/>
<category term="建模" scheme="http://www.typedefine.cn/tags/%E5%BB%BA%E6%A8%A1/"/>
<category term="NoSQL" scheme="http://www.typedefine.cn/tags/NoSQL/"/>
<category term="Spring" scheme="http://www.typedefine.cn/tags/Spring/"/>
<category term="Spring Cloud" scheme="http://www.typedefine.cn/tags/Spring-Cloud/"/>
</entry>
<entry>
<title>MongoDB建模的简单原则</title>
<link href="http://www.typedefine.cn/2020/12/07/MongoDB%E5%BB%BA%E6%A8%A1%E7%9A%84%E4%B8%80%E4%BA%9B%E7%AE%80%E5%8D%95%E5%8E%9F%E5%88%99/"/>
<id>http://www.typedefine.cn/2020/12/07/MongoDB%E5%BB%BA%E6%A8%A1%E7%9A%84%E4%B8%80%E4%BA%9B%E7%AE%80%E5%8D%95%E5%8E%9F%E5%88%99/</id>
<published>2020-12-07T06:56:59.000Z</published>
<updated>2020-12-07T06:56:59.000Z</updated>
<summary type="html">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><h1 id="建模原则:"><a href="#建模原则:"
</summary>
<category term="架构" scheme="http://www.typedefine.cn/categories/%E6%9E%B6%E6%9E%84/"/>
<category term="MongoDB" scheme="http://www.typedefine.cn/tags/MongoDB/"/>
<category term="建模" scheme="http://www.typedefine.cn/tags/%E5%BB%BA%E6%A8%A1/"/>
<category term="NoSQL" scheme="http://www.typedefine.cn/tags/NoSQL/"/>
</entry>
<entry>
<title>Nacos不支持MYSQL 8的问题</title>
<link href="http://www.typedefine.cn/2020/04/29/Nacos%E4%B8%8D%E6%94%AF%E6%8C%81MYSQL-8%E7%9A%84%E9%97%AE%E9%A2%98/"/>
<id>http://www.typedefine.cn/2020/04/29/Nacos%E4%B8%8D%E6%94%AF%E6%8C%81MYSQL-8%E7%9A%84%E9%97%AE%E9%A2%98/</id>
<published>2020-04-29T14:22:14.000Z</published>
<updated>2020-04-29T14:22:14.000Z</updated>
<summary type="html">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/hint.css/2.4.1/hint.min.css"><p>Nacos遇到MySQL
</summary>
<category term="框架" scheme="http://www.typedefine.cn/categories/%E6%A1%86%E6%9E%B6/"/>
<category term="微服务" scheme="http://www.typedefine.cn/categories/%E6%A1%86%E6%9E%B6/%E5%BE%AE%E6%9C%8D%E5%8A%A1/"/>
<category term="微服务" scheme="http://www.typedefine.cn/tags/%E5%BE%AE%E6%9C%8D%E5%8A%A1/"/>
<category term="Nacos" scheme="http://www.typedefine.cn/tags/Nacos/"/>
<category term="MySQL" scheme="http://www.typedefine.cn/tags/MySQL/"/>
</entry>
<entry>
<title>快车道系列:理解文档对象模型DOM</title>
<link href="http://www.typedefine.cn/2020/03/30/Web%E5%BF%AB%E8%BD%A6%E9%81%93%E7%B3%BB%E5%88%97%EF%BC%9A%E7%90%86%E8%A7%A3%E6%96%87%E6%A1%A3%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8BDOM/"/>
<id>http://www.typedefine.cn/2020/03/30/Web%E5%BF%AB%E8%BD%A6%E9%81%93%E7%B3%BB%E5%88%97%EF%BC%9A%E7%90%86%E8%A7%A3%E6%96%87%E6%A1%A3%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8BDOM/</id>
<published>2020-03-30T13:53:13.000Z</published>
<updated>2020-03-30T13:53:13.000Z</updated>
<summary type="html">
<h3 id="DOM是什么?"><a href="#DOM是什么?" class="headerlink" title="DOM是什么?"></a>DOM是什么?</h3><p>Document Object Model<sup id="fnref:0"><a href="#fn:0" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="https://www.w3.org/TR/DOM-Level-2-Core/introduction.html
">[0]</span></a></sup>,简称DOM, 文档对象模型, 是一套抽象的、单一的、具有一致性的API。这一套API是与具体实现和具体语言无关的。在WHATAG CORE 3 Living Standard<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="https://dom.spec.whatwg.org/
">[1]</span></a></sup>上通过Web IDL定义给出。</p>
<p>HTML和定义良好的XML都是结构化,里面的内容、表现、属性都可以通过节点和对象的方式来表示,形成一棵树形结构(或者是森林)。而DOM所定义的API就是用来访问、操作、修改里面的数据。</p>
</summary>
<category term="web" scheme="http://www.typedefine.cn/categories/web/"/>
<category term="web" scheme="http://www.typedefine.cn/tags/web/"/>
<category term="DOM" scheme="http://www.typedefine.cn/tags/DOM/"/>
<category term="Fast Track" scheme="http://www.typedefine.cn/tags/Fast-Track/"/>
<category term="快车道" scheme="http://www.typedefine.cn/tags/%E5%BF%AB%E8%BD%A6%E9%81%93/"/>
</entry>
<entry>
<title>Kafka调研(3):多点通信方案的设计-2</title>
<link href="http://www.typedefine.cn/2020/03/13/%E5%88%A9%E7%94%A8Kafka%E8%AE%BE%E8%AE%A1%E5%BA%94%E7%94%A8%E5%B1%82%E5%A4%9A%E7%82%B9%E9%80%9A%E4%BF%A1%E6%96%B9%E6%A1%88/"/>
<id>http://www.typedefine.cn/2020/03/13/%E5%88%A9%E7%94%A8Kafka%E8%AE%BE%E8%AE%A1%E5%BA%94%E7%94%A8%E5%B1%82%E5%A4%9A%E7%82%B9%E9%80%9A%E4%BF%A1%E6%96%B9%E6%A1%88/</id>
<published>2020-03-13T06:46:04.000Z</published>
<updated>2020-03-13T06:46:04.000Z</updated>
<summary type="html">
<h1 id="1-星形拓扑的通信模型"><a href="#1-星形拓扑的通信模型" class="headerlink" title="1. 星形拓扑的通信模型"></a>1. 星形拓扑的通信模型</h1><p>星形的意思是说,有一个消息接收和转发中心,应用两两之间并不直接通信。所有的应用层消息都通过Kafka集群进行中转。但是对Kafka来说,消息的机制是推拉机制。如果需要接收消息,需要应用层连接到集群,订阅感兴趣的topic,然后poll消息。</p>
<p>为了实现这种模型,<br><strong>1. 我们利用Kafka本身的ACL控制机制来对topic权限进行控制</strong>。</p>
<ul>
<li>对每一个应用分配唯一的Consumer Group。</li>
<li>对每一个接入的应用分配唯一的账户和密码。</li>
<li>对每一个接入的应用分配SSL证书</li>
<li>对每一个topic按照应用进行配置读写权限。</li>
<li>对每一个接入的应用分配一个唯一的秘钥(该秘钥通过安全方式传递)。</li>
</ul>
<p><strong><em>2. 同时我们在应用包装一层API进行消息分派机制</em></strong></p>
<ul>
<li>应用层的消息需要进行加密。</li>
<li>应用层需要校验消息的来源和完整性。</li>
<li>判断该消息是否应该被处理,比如消息的接收方是否包含了自己。</li>
<li>应用层需要按照消息的业务ID(或者其他机制)分派合适的处理函数。</li>
</ul>
</summary>
<category term="Kafka" scheme="http://www.typedefine.cn/categories/Kafka/"/>
<category term="Architecture" scheme="http://www.typedefine.cn/categories/Kafka/Architecture/"/>
<category term="Message Queue" scheme="http://www.typedefine.cn/tags/Message-Queue/"/>
<category term="Kafka" scheme="http://www.typedefine.cn/tags/Kafka/"/>
<category term="Topo Comm model" scheme="http://www.typedefine.cn/tags/Topo-Comm-model/"/>
<category term="Frameword" scheme="http://www.typedefine.cn/tags/Frameword/"/>
<category term="星形拓扑通信" scheme="http://www.typedefine.cn/tags/%E6%98%9F%E5%BD%A2%E6%8B%93%E6%89%91%E9%80%9A%E4%BF%A1/"/>
<category term="应用层设计" scheme="http://www.typedefine.cn/tags/%E5%BA%94%E7%94%A8%E5%B1%82%E8%AE%BE%E8%AE%A1/"/>
</entry>
<entry>
<title>Kafka调研(3):多点通信方案的设计-1</title>
<link href="http://www.typedefine.cn/2020/02/17/Kafka%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A3%EF%BC%9A%E5%9F%BA%E4%BA%8EKafka%E5%A4%9A%E7%82%B9%E9%80%9A%E4%BF%A1%E6%96%B9%E6%A1%88/"/>
<id>http://www.typedefine.cn/2020/02/17/Kafka%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A3%EF%BC%9A%E5%9F%BA%E4%BA%8EKafka%E5%A4%9A%E7%82%B9%E9%80%9A%E4%BF%A1%E6%96%B9%E6%A1%88/</id>
<published>2020-02-17T03:30:38.000Z</published>
<updated>2020-02-17T03:30:38.000Z</updated>
<summary type="html">
<h1 id="1-引言"><a href="#1-引言" class="headerlink" title="1. 引言"></a>1. 引言</h1><p>在华为核心网和无线领域有几个重量级的产品比如U2000/M2000等网管系统<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="http://ishare.iask.sina.com.cn/f/LmFNcBVsuz.html
">[1]</span></a></sup>。里面的底层通信就是一套基于MDP(Message Dispatching Process)的星形拓扑通信系统。不同的业务进程之间通过消息(REQ/RSP)来通信,而不是通信RPC或者库的依赖。</p>
<p>由于年代久远,和现在主流的MQ技术相比有一些不同的地方,随便说几点:</p>
<ol>
<li><p><strong><em>消息序列化只支持ASN.1</em></strong>. 当然好处在于提供一套抽象的语义定义,并且大家只需要传递ASN.1文件即可。或者由一个公共方将ASN.1文件编程对应的模型和支撑库提供给各个端对进行开发。但是同时呢,不好的地方也很明显,一方面是技术过时,再一个就是需要一个专门的团队来维护ASN.1定义和相应的工具;另一方面在于管理上没有形成一个好的ASN.1的分发机制。导致版本之间定义很混乱。对于前后向兼容性问题很难做到。当然,在网上也可以找到一些开源的ASN.1 Compiler<sup id="fnref:3"><a href="#fn:3" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="https://github.com/vlm/asn1c
">[3]</span></a></sup>。能不能用不清楚。</p>
</li>
<li><p><strong><em>MDP并不支持消息的缓存和队列机制,本身也不提供可靠性保证。</em></strong> 那么如何来提供不丢失的消息呢? 在华为,答案是提供一个框架层,业务团队并不直接使用MDP提供的库和接口,而是使用封装之后的一套框架,这套框架中提供了可靠性事件的发送的。实现的机制就是在发送之前存库。在接收业务处理完成之后,再从数据库中移除。当然这套机制也出现过不少问题,比如消息积压,数据库的内容不断上涨,甚至在局点可能出现过数据库表过大,导致其他业务访问很慢,甚至于极端情况下,整个数据库崩掉的情况都有。</p>
</li>
<li><p><strong><em>MDP无法水平扩展,当消息出现峰值的时候,MDP有可能出现丢包的问题。</em></strong> 这个问题也比较头疼。这是从一开始设计的时候就没有考虑的问题。考虑到U2000/M2000对应的数据量实际上是很大的。假如MDP的处理峰值在于2000/s,每秒钟2W条消息尽力保证不丢包。 这个阈值总会在未来的某一天会被打破,那么这个时候问题就出来了,系统会出现频繁丢包,系统业务频繁故障,但是由于底层数据通道,在应用层面几乎无法做到一个比较好的解决方案。</p>
</li>
<li><p><strong><em>MDP采用ACE<sup id="fnref:4"><a href="#fn:4" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="http://www.dre.vanderbilt.edu/~schmidt/TAO-overview.html
">[4]</span></a></sup>,这一套框架比较复杂。</em></strong>当然整体的U2000/M2000都是基于这个来开发,导致比较重型。<br>另外就是在U2000/M2000北向领域,采用了大量的ACE/TAO/Event Channel机制。灵活性不够。<br><strong><em>为什么说CORBA是一个很不好的技术,最终会被时代所抛弃? 可以看这篇论文</em></strong>。<a href="/2020/02/17/Kafka%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A3%EF%BC%9A%E5%9F%BA%E4%BA%8EKafka%E5%A4%9A%E7%82%B9%E9%80%9A%E4%BF%A1%E6%96%B9%E6%A1%88/1142031.1142044.pdf" title="下载链接">下载链接</a></p>
</li>
<li><p><strong><em>当前通信架构转异构通信架构的难度。</em></strong>对于U2000/M2000来说,所有的开发支撑库都需要自己来完成。当然,对于华为来说,这个不是问题。问题这是人力预算的问题。</p>
</li>
</ol>
<p>上面说的一些问题在华为内部看来,有一些并不是问题,有一些问题可以绕过。有几个点:</p>
<ol>
<li><strong><em>客户的OSS/BSS系统都是基于CORBA调用。</em></strong></li>
<li><strong><em>ITU的标准定义就是基于ASN.1模型发布。</em></strong></li>
<li><strong><em>整个产品技术切换的成本太高, 所以要保护既有投资,CORBA技术带来的复杂度也可以成为一种护城河。</em></strong></li>
<li><strong><em>整个业务开发团队转型所面临的学习成本、人才招聘、人力缺口等等。</em></strong></li>
</ol>
<p>那么,从这几点来考虑,保持当前技术稳定,保持客户服务的稳定变是重点。所以,对于大企业来说,真的不是某个技术好就要上的。上面这个并非是吐槽,而是纯粹从技术上来分析我所经历过的产品在架构上的一些问题。</p>
<p>那么回过头来,那么如何通过messge queue来解耦不同系统(同构的还是异构的)来交换和通信来实现多异构同构系统之间的 星形通信呢? 我们来做一个简单的设计。</p>
</summary>
<category term="Kafka" scheme="http://www.typedefine.cn/categories/Kafka/"/>
<category term="Architecture" scheme="http://www.typedefine.cn/categories/Kafka/Architecture/"/>
<category term="Message Queue" scheme="http://www.typedefine.cn/tags/Message-Queue/"/>
<category term="Kafka" scheme="http://www.typedefine.cn/tags/Kafka/"/>
<category term="Topo Comm model" scheme="http://www.typedefine.cn/tags/Topo-Comm-model/"/>
</entry>
<entry>
<title>使用Socket.io搭建WS服务并通过Nginx反向代理</title>
<link href="http://www.typedefine.cn/2020/02/17/%E7%94%A8Nodejs%E5%92%8CNginx%E6%90%AD%E5%BB%BAWebsocket%E6%9C%8D%E5%8A%A1%E4%BB%A5%E5%8F%8A%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE/"/>
<id>http://www.typedefine.cn/2020/02/17/%E7%94%A8Nodejs%E5%92%8CNginx%E6%90%AD%E5%BB%BAWebsocket%E6%9C%8D%E5%8A%A1%E4%BB%A5%E5%8F%8A%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE/</id>
<published>2020-02-17T01:46:21.000Z</published>
<updated>2020-03-07T04:40:00.000Z</updated>
<summary type="html">
<h1 id="Nodejs、Express、Socket-io、Nginx"><a href="#Nodejs、Express、Socket-io、Nginx" class="headerlink" title="Nodejs、Express、Socket.io、Nginx"></a>Nodejs、Express、Socket.io、Nginx</h1><p>使用Express框架和Socket.io库将websocket搭建起来,并监听同一个端口,参考官方例子<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="https://socket.io/docs/#Using-with-Express
">[1]</span></a></sup>就可以,非常简单。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> app = <span class="built_in">require</span>(<span class="string">'express'</span>)();</span><br><span class="line"><span class="keyword">var</span> server = <span class="built_in">require</span>(<span class="string">'http'</span>).Server(app);</span><br><span class="line"><span class="keyword">var</span> io = <span class="built_in">require</span>(<span class="string">'socket.io'</span>)(server);</span><br><span class="line"></span><br><span class="line">server.listen(<span class="number">80</span>);</span><br><span class="line"><span class="comment">// WARNING: app.listen(80) will NOT work here!</span></span><br><span class="line"></span><br><span class="line">app.get(<span class="string">'/'</span>, <span class="function"><span class="keyword">function</span> (<span class="params">req, res</span>) </span>&#123;</span><br><span class="line">res.sendFile(__dirname + <span class="string">'/index.html'</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">io.on(<span class="string">'connection'</span>, <span class="function"><span class="keyword">function</span> (<span class="params">socket</span>) </span>&#123;</span><br><span class="line">socket.emit(<span class="string">'news'</span>, &#123; <span class="attr">hello</span>: <span class="string">'world'</span> &#125;);</span><br><span class="line">socket.on(<span class="string">'my other event'</span>, <span class="function"><span class="keyword">function</span> (<span class="params">data</span>) </span>&#123;</span><br><span class="line"> <span class="built_in">console</span>.log(data);</span><br><span class="line">&#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure>
<h1 id="Nginx同时作为Web-Server和WebSocket-Reverse-Proxy"><a href="#Nginx同时作为Web-Server和WebSocket-Reverse-Proxy" class="headerlink" title="Nginx同时作为Web Server和WebSocket Reverse Proxy"></a>Nginx同时作为Web Server和WebSocket Reverse Proxy</h1><p>在配置Nginx的时候,遇到了很多的问题,并且在网上现在找不到一篇对这个问题讲解的非常清楚的文档。<br>比如:</p>
</summary>
<category term="websokcet" scheme="http://www.typedefine.cn/categories/websokcet/"/>
<category term="nodejs" scheme="http://www.typedefine.cn/categories/websokcet/nodejs/"/>
<category term="websocket" scheme="http://www.typedefine.cn/tags/websocket/"/>
<category term="nginx" scheme="http://www.typedefine.cn/tags/nginx/"/>
<category term="Socket.io" scheme="http://www.typedefine.cn/tags/Socket-io/"/>
<category term="Nodejs" scheme="http://www.typedefine.cn/tags/Nodejs/"/>
<category term="express" scheme="http://www.typedefine.cn/tags/express/"/>
</entry>
<entry>
<title>Kafka调研(2):消息序列化框架建议与对比</title>
<link href="http://www.typedefine.cn/2020/02/14/Kafka%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A2-%E6%B6%88%E6%81%AF%E5%BA%8F%E5%88%97%E5%8C%96%E6%A1%86%E6%9E%B6%E6%A8%AA%E5%90%91%E5%AF%B9%E6%AF%94/"/>
<id>http://www.typedefine.cn/2020/02/14/Kafka%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A2-%E6%B6%88%E6%81%AF%E5%BA%8F%E5%88%97%E5%8C%96%E6%A1%86%E6%9E%B6%E6%A8%AA%E5%90%91%E5%AF%B9%E6%AF%94/</id>
<published>2020-02-14T03:57:26.000Z</published>
<updated>2020-02-14T03:57:26.000Z</updated>
<summary type="html">
<h2 id="调研结果和建议"><a href="#调研结果和建议" class="headerlink" title="调研结果和建议"></a>调研结果和建议</h2><p>综合来看,Avro或者Protocol Buffer二选一即可, 但是出于灵活性和标准JSON的支持力度上来看,更推荐Protocol Buffers。同时部分数据依然可以通过JSON方式传输。</p>
<h2 id="主流序列化框架对比"><a href="#主流序列化框架对比" class="headerlink" title="主流序列化框架对比"></a>主流序列化框架对比</h2><h3 id="Kafka的序列化"><a href="#Kafka的序列化" class="headerlink" title="Kafka的序列化"></a>Kafka的序列化</h3><p>Kafka并不限定的消息格式。Kafka自身提供了一系列的序列化器,比如ByteArraySerializer,ByteBufferSerializer,DoubleSerializer,FloatSerializer,StringSerializer,UUIDSerializer, IntegerDeserializer, LongSerializer, ShortSerializer, 总结起来就是基本类型、字符串类型、二进制消息。</p>
<p>但是在通常情况下不会使用比如Float这种来做序列化,原因在于系统间交互或者放到Kafka的数据一般来说都比较复杂,无法用一个字段来表示。于是,这种情况下,就需要在Kafka之上建立一个消息格式的契约,以便于Kafka的生产者和消费者之间都能理解消息中的语义。最好地方就是在Kafka基础之上增加一层应用层的消息协议,比如JSON格式、比如二进制编解码协议(序列化),出于性能考虑,一般也不直接使用Java POJO对象的原生序列化(虽然可行)。在Apache Spark中使用的Kryo Register,由于场景限制(不提供IDL定义),不适用Kafka。</p>
<p>下面对常见的几个序列化框架做一个横向对比:</p>
</summary>
<category term="Message Queue - Kafka" scheme="http://www.typedefine.cn/categories/Message-Queue-Kafka/"/>
<category term="Message Queue" scheme="http://www.typedefine.cn/tags/Message-Queue/"/>
<category term="Kafka" scheme="http://www.typedefine.cn/tags/Kafka/"/>
<category term="Architecture" scheme="http://www.typedefine.cn/tags/Architecture/"/>
<category term="Serialization" scheme="http://www.typedefine.cn/tags/Serialization/"/>
<category term="JSON" scheme="http://www.typedefine.cn/tags/JSON/"/>
<category term="Apahce Avro" scheme="http://www.typedefine.cn/tags/Apahce-Avro/"/>
<category term="Apahce Thrift" scheme="http://www.typedefine.cn/tags/Apahce-Thrift/"/>
<category term="Protocol Buffers" scheme="http://www.typedefine.cn/tags/Protocol-Buffers/"/>
</entry>
<entry>
<title>Kafka调研(1):跨数据中心的多集群镜像</title>
<link href="http://www.typedefine.cn/2020/02/14/Kafka%E5%88%9D%E6%AD%A5%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A-%E8%B7%A8%E6%95%B0%E6%8D%AE%E4%B8%AD%E5%BF%83%E9%9B%86%E7%BE%A4/"/>
<id>http://www.typedefine.cn/2020/02/14/Kafka%E5%88%9D%E6%AD%A5%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A-%E8%B7%A8%E6%95%B0%E6%8D%AE%E4%B8%AD%E5%BF%83%E9%9B%86%E7%BE%A4/</id>
<published>2020-02-14T03:12:23.000Z</published>
<updated>2020-02-14T03:12:23.000Z</updated>
<summary type="html">
<h2 id="调研结果和建议"><a href="#调研结果和建议" class="headerlink" title="调研结果和建议"></a>调研结果和建议</h2><p>针对是否可以跨数据中心部署Kafka集群的问题,答案是可行,但是不建议。建议先支持单集群部署,以简化运维成本,支持多地多应用业务上线。</p>
<h3 id="可行性与跨网络部署产生的问题"><a href="#可行性与跨网络部署产生的问题" class="headerlink" title="可行性与跨网络部署产生的问题"></a>可行性与跨网络部署产生的问题</h3><p>Kafka实际上并不禁止将Broker部署到不同的网络地域。但是,Kafka的设计是按照单个数据中心进行设计、开发、测试和调优的。从Kafka的官方文档<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="Kafka Documentation#Datacenter。http://kafka.apache.org/documentation/#datacenters
">[1]</span></a></sup>来看,并不推荐将集群跨网络部署。 由于Broker分布在不同的跨地域的网络(WAN), 除了数据同步会极大地增加延迟之外, 并且如果由于网络中断无法保证zk始终可用,带来其他问题,比如:</p>
<ol>
<li>Partition Leader无法选举。或者由于网络问题,某个Broker频繁掉线导致集群不稳定。</li>
<li>在Producer推送数据时候,产生延迟(推送到remote Broker)。或者由于网络问题,无法获取ACK。</li>
</ol>
</summary>
<category term="Message Queue - Kafka" scheme="http://www.typedefine.cn/categories/Message-Queue-Kafka/"/>
<category term="Message Queue" scheme="http://www.typedefine.cn/tags/Message-Queue/"/>
<category term="Kafka" scheme="http://www.typedefine.cn/tags/Kafka/"/>
<category term="Data center" scheme="http://www.typedefine.cn/tags/Data-center/"/>
<category term="Cluster" scheme="http://www.typedefine.cn/tags/Cluster/"/>
<category term="Mirror Maker" scheme="http://www.typedefine.cn/tags/Mirror-Maker/"/>
<category term="Architecture" scheme="http://www.typedefine.cn/tags/Architecture/"/>
</entry>
<entry>
<title>什么是Kafka</title>
<link href="http://www.typedefine.cn/2020/02/14/%E4%BB%80%E4%B9%88%E6%98%AFKafka/"/>
<id>http://www.typedefine.cn/2020/02/14/%E4%BB%80%E4%B9%88%E6%98%AFKafka/</id>
<published>2020-02-14T02:30:23.000Z</published>
<updated>2020-02-14T02:30:23.000Z</updated>
<summary type="html">
<p><strong><em>占坑,后面有时间对Kafka进行详细的更新</em></strong></p>
<h1 id="A-bit-of-History"><a href="#A-bit-of-History" class="headerlink" title="A bit of History"></a>A bit of History</h1><p>Kafka是高性能的、分布式的、数据可持久化的消息丢列。最初由LinkedIn开发,用来跟踪Web上的用户的一系列事件,譬如页面浏览(Page view),搜索框的输入,展示的广告等等。这些事件对于监控和调查用于对于网站交互的参与度非常的重要。每天都有大量的数据产生,因为,需要一个可以轻松扩展,同时又不会增加额外负担的一个解决方案。</p>
<p>总体来说,Kafka从设计之初有3个目标:</p>
<ol>
<li>简单的生产者/消费者API设计</li>
<li>尽可能减少网络传输和磁盘存储的额外成本</li>
<li>从一开始就为可扩展性而设计</li>
</ol>
</summary>
<category term="Message Queue - Kafka" scheme="http://www.typedefine.cn/categories/Message-Queue-Kafka/"/>
<category term="Architecture" scheme="http://www.typedefine.cn/categories/Message-Queue-Kafka/Architecture/"/>
<category term="Architecture" scheme="http://www.typedefine.cn/tags/Architecture/"/>
<category term="Message Queue - Kafka" scheme="http://www.typedefine.cn/tags/Message-Queue-Kafka/"/>
<category term="JMS" scheme="http://www.typedefine.cn/tags/JMS/"/>
</entry>
<entry>
<title>什么是MQ</title>
<link href="http://www.typedefine.cn/2020/02/14/%E4%BB%80%E4%B9%88%E6%98%AFMQ/"/>
<id>http://www.typedefine.cn/2020/02/14/%E4%BB%80%E4%B9%88%E6%98%AFMQ/</id>
<published>2020-02-14T02:10:23.000Z</published>
<updated>2020-02-14T02:10:23.000Z</updated>
<summary type="html">
<p><strong><em>这篇文章是一篇未完成稿,有时间再写</em></strong></p>
<h1 id="什么是消息队列(Message-Queue)"><a href="#什么是消息队列(Message-Queue)" class="headerlink" title="什么是消息队列(Message Queue)?"></a>什么是消息队列(Message Queue)?</h1><p>消息队列使得应用之间可以通过互发消息的方式来通信,这和传统的RPC方式有很大的区别。通过消息队列提供的服务,解除了点对点,星形拓扑通信耦合的问题。同时,当目标服务不可用的时候,消息队列充当了临时的消息缓存。</p>
<p>下面先解释一下什么是消息队列<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="https://www.cloudamqp.com/blog/2014-12-03-what-is-message-queuing.html
">[1]</span></a></sup>,怎么使用,在架构层面又会带来什么样的好处<sup id="fnref:2"><a href="#fn:2" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="扩展阅读:https://www.ibm.com/cloud/learn/message-queues
">[2]</span></a></sup>。</p>
<p><strong><em>队列</em></strong>就是将事物排成一列,依次处理,并且依照先进先出(First In, First Out)的顺序。那么消息队列(MQ),就是用于不同系统或者应用之间通信的的列表, 将需要通信的消息保存在队列中,等待应用依次处理。<a href="http://queues.io/" target="_blank" rel="noopener">queues.io</a>是一个比较好的网站可以查找各种不同功能的队列。</p>
</summary>
<category term="Message Queue - Kafka" scheme="http://www.typedefine.cn/categories/Message-Queue-Kafka/"/>
<category term="Message Queue" scheme="http://www.typedefine.cn/tags/Message-Queue/"/>
<category term="Architecture" scheme="http://www.typedefine.cn/tags/Architecture/"/>
<category term="JMS" scheme="http://www.typedefine.cn/tags/JMS/"/>
<category term="AMQP" scheme="http://www.typedefine.cn/tags/AMQP/"/>
<category term="MQTT" scheme="http://www.typedefine.cn/tags/MQTT/"/>
</entry>
<entry>
<title>Thrift介绍、编译参数以及如何和maven集成</title>
<link href="http://www.typedefine.cn/2020/02/13/thrift%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7%E6%94%AF%E6%8C%81%E5%8F%82%E6%95%B0/"/>
<id>http://www.typedefine.cn/2020/02/13/thrift%E7%BC%96%E8%AF%91%E5%B7%A5%E5%85%B7%E6%94%AF%E6%8C%81%E5%8F%82%E6%95%B0/</id>
<published>2020-02-13T13:07:49.000Z</published>
<updated>2020-02-13T13:07:49.000Z</updated>
<summary type="html">
<h1 id="什么是Thrift"><a href="#什么是Thrift" class="headerlink" title="什么是Thrift?"></a>什么是Thrift?</h1><p>Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统)、Cappuccino、Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk。虽然它以前是由Facebook开发的,但它现在是Apache软件基金会的开源项目了。该实现被描述在2007年4月的一篇由Facebook发表的技术论文中,该论文现由Apache掌管。</p>
<p>目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。本文将详细介绍 Thrift 的使用,并且提供丰富的实例代码加以解释说明,帮助使用者快速构建服务。Thrift的下载地址是:<a href="http://thrift.apache.org/download" target="_blank" rel="noopener">http://thrift.apache.org/download</a></p>
<h1 id="thrift-exe支持的参数有哪些?"><a href="#thrift-exe支持的参数有哪些?" class="headerlink" title="thrift.exe支持的参数有哪些?"></a>thrift.exe支持的参数有哪些?</h1>
</summary>
<category term="thrift" scheme="http://www.typedefine.cn/categories/thrift/"/>
<category term="thrift" scheme="http://www.typedefine.cn/tags/thrift/"/>
<category term="compiler" scheme="http://www.typedefine.cn/tags/compiler/"/>
<category term="command line options" scheme="http://www.typedefine.cn/tags/command-line-options/"/>
</entry>
<entry>
<title>为什么会害怕人工智能</title>
<link href="http://www.typedefine.cn/2020/02/12/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BC%9A%E5%AE%B3%E6%80%95%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
<id>http://www.typedefine.cn/2020/02/12/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BC%9A%E5%AE%B3%E6%80%95%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/</id>
<published>2020-02-12T03:08:30.000Z</published>
<updated>2020-02-12T03:08:30.000Z</updated>
<summary type="html">
<p>原作者: 保罗▪福特 2015年2月11日<br>译者: 山野@成都 2017</p>
<h1 id="在阅读之前"><a href="#在阅读之前" class="headerlink" title="在阅读之前"></a>在阅读之前</h1><p>这篇文章<sup id="fnref:1"><a href="#fn:1" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="https://www.technologyreview.com/s/534871/our-fear-of-artificial-intelligence/
">[1]</span></a></sup>是我在2017年在麻省理工评论(MIT Technology Review)上看到的翻译的。 作者是保罗▪福特<sup id="fnref:2"><a href="#fn:2" rel="footnote"><span class="hint--top hint--error hint--medium hint--rounded hint--bounce" aria-label="https://www.technologyreview.com/profile/paul-ford/
">[2]</span></a></sup>。距离当初的翻译已经过去了2年。现在人工智能的概念已经深入到各行各业,从大家经常接触的SNS社交数据挖掘、智能客服、B2C商品推荐系统、新闻推荐系统、智能汽车,以及到更广泛的更偏向于传统的领域,比如医疗、城市规划、交通领域、建筑领域、社区管理、行政服务等等的一切都在提到一个词,那就是“智慧”,“智能”。</p>
<p>这一切的背后都和机器学习技术(深度学习、加强学习)等等的兴起,以及更加容易使用的框架和API,比如谷歌的tensorflow;更加容易处理大规模数据的框架,比如Apache Spark、Apache Hadoop套件等,这些都助力于并提高了各种业务对于基于大量数据的建模和预测能力。而这些能力就是大家所说的人工智能。</p>
<p>下面这篇文章并没有讲解具体的某种应用于人工智能的技术,而是从更高更抽象的层面,从社会和伦理的层面探讨了人工智能所带来的一些问题。</p>
<p>下面是正文:</p>
</summary>
<category term="科技 - 人工智能" scheme="http://www.typedefine.cn/categories/%E7%A7%91%E6%8A%80-%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
<category term="翻译" scheme="http://www.typedefine.cn/categories/%E7%A7%91%E6%8A%80-%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/%E7%BF%BB%E8%AF%91/"/>
<category term="人工智能" scheme="http://www.typedefine.cn/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
<category term="未来科技" scheme="http://www.typedefine.cn/tags/%E6%9C%AA%E6%9D%A5%E7%A7%91%E6%8A%80/"/>
<category term="麻省理工评论" scheme="http://www.typedefine.cn/tags/%E9%BA%BB%E7%9C%81%E7%90%86%E5%B7%A5%E8%AF%84%E8%AE%BA/"/>
<category term="自由意志" scheme="http://www.typedefine.cn/tags/%E8%87%AA%E7%94%B1%E6%84%8F%E5%BF%97/"/>
</entry>
<entry>
<title>maven构建的一些小技巧</title>
<link href="http://www.typedefine.cn/2020/02/10/maven%E6%9E%84%E5%BB%BA%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%8A%80%E5%B7%A7/"/>
<id>http://www.typedefine.cn/2020/02/10/maven%E6%9E%84%E5%BB%BA%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E6%8A%80%E5%B7%A7/</id>
<published>2020-02-10T08:02:55.000Z</published>
<updated>2020-02-10T08:02:55.000Z</updated>
<summary type="html">
<p>maven从设计上来说非常的简单,但是却是一个非常强大的工具。很多人将maven只是当做一个构建工具(从源代码生成可运行软件),但是实际上可以将maven当做一个项目管理工具,比如工程管理、插件管理、Jar包依赖管理、软件发布仓库管理等。</p>
<p>下面讲解一些在使用maven当中所遇到的一些小的技巧。</p>
</summary>
<category term="Building tools - maven" scheme="http://www.typedefine.cn/categories/Building-tools-maven/"/>
<category term="maven" scheme="http://www.typedefine.cn/tags/maven/"/>
<category term="profiles" scheme="http://www.typedefine.cn/tags/profiles/"/>
<category term="settings.xml" scheme="http://www.typedefine.cn/tags/settings-xml/"/>
<category term="mirrorOf" scheme="http://www.typedefine.cn/tags/mirrorOf/"/>
</entry>
<entry>
<title>通过maven自动化构建protobuf class代码</title>
<link href="http://www.typedefine.cn/2020/02/10/%E9%80%9A%E8%BF%87maven%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BAprotobuf/"/>
<id>http://www.typedefine.cn/2020/02/10/%E9%80%9A%E8%BF%87maven%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BAprotobuf/</id>
<published>2020-02-10T05:30:03.000Z</published>
<updated>2020-02-10T05:30:03.000Z</updated>
<summary type="html">
<h2 id="通过maven自动化构建protocal-buffer"><a href="#通过maven自动化构建protocal-buffer" class="headerlink" title="通过maven自动化构建protocal buffer"></a>通过maven自动化构建protocal buffer</h2><p>当对代码进行工程构建的时候,如果能够尽可能的自动化,这样对于提升整个软件质量、节省人力成本、减少因为人工干预导致的各种不可预知的错误是很好。<br>从protobuf的官方文档来看,通过cmd调用protoc当然可以生成相应的代码,但是对构建不够友好。于是,可以考虑通过maven来进行自动化构建,在启动maven构建的时候,自动调用protoc,生成代码,并打包成相应的jar包,集成到工程发布包中。<br>这里有2种方式,如下。</p>
</summary>
<category term="Building tools - maven" scheme="http://www.typedefine.cn/categories/Building-tools-maven/"/>
<category term="protocol buffer" scheme="http://www.typedefine.cn/categories/Building-tools-maven/protocol-buffer/"/>
<category term="maven" scheme="http://www.typedefine.cn/tags/maven/"/>
<category term="protocol" scheme="http://www.typedefine.cn/tags/protocol/"/>
<category term="buffer" scheme="http://www.typedefine.cn/tags/buffer/"/>
</entry>
</feed>