-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
812 lines (525 loc) · 30.2 KB
/
index.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
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
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
<!doctype html>
<html class="theme-next use-motion ">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<link rel="stylesheet" type="text/css" href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5"/>
<link rel="stylesheet" type="text/css" href="/css/main.css?v=0.4.3"/>
<meta name="keywords" content="Hexo,next" />
<link rel="shorticon icon" type="image/x-icon" href="/favicon.ico?v=0.4.3" />
<script type="text/javascript" id="hexo.configuration">
var CONFIG = {
scheme: '',
analytics: {
google: ''
},
sidebar: 'post'
};
</script>
<title> cat memory | nc baas.im 9 </title>
</head>
<body>
<!--[if lte IE 8]> <div style=' clear: both; height: 59px; padding:0 0 0 15px; position: relative;margin:0 auto;'> <a href="http://windows.microsoft.com/en-US/internet-explorer/products/ie/home?ocid=ie6_countdown_bannercode"><img src="http://7u2nvr.com1.z0.glb.clouddn.com/picouterie.jpg" border="0" height="42" width="820" alt="You are using an outdated browser. For a faster, safer browsing experience, upgrade for free today or use other browser ,like chrome firefox safari." style='margin-left:auto;margin-right:auto;display: block;'/></a></div> <![endif]-->
<div class="container one-column
page-home
">
<div class="headband"></div>
<div id="header" class="header">
<div class="header-inner">
<h1 class="site-meta">
<span class="logo-line-before"><i></i></span>
<a href="/" class="brand">
<span class="logo">
<i class="icon-logo"></i>
</span>
<span class="site-title">cat memory | nc baas.im 9</span>
</a>
<span class="logo-line-after"><i></i></span>
</h1>
<ul id="menu" class="menu">
<li class="menu-item menu-item-home">
<a href="/">
<i class="menu-item-icon icon-home"></i> <br />
首页
</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives">
<i class="menu-item-icon icon-archives"></i> <br />
归档
</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags">
<i class="menu-item-icon icon-tags"></i> <br />
标签
</a>
</li>
</ul>
</div>
</div>
<div id="main" class="main">
<div class="main-inner">
<div id="content" class="content">
<div id="posts" class="posts-expand">
<div class="post post-type-normal ">
<div class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="/2015/06/02/kafka-broker-id/">
kafka broker id
</a>
</h1>
<div class="post-meta">
<span class="post-time">
发表于 2015-06-02
</span>
<span class="post-comments-count">
|
<a href="/2015/06/02/kafka-broker-id/#comments" >
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/06/02/kafka-broker-id/"></span>
</a>
</span>
</div>
</div>
<div class="post-body">
<p>根据<a href="http://kafka.apache.org/documentation.html">Kafka官方文档</a> (见下文)</p>
<blockquote>
<blockquote>
<p><strong>Broker Node Registry</strong></p>
<p><code>/brokers/ids/[0...N] --> host:port (ephemeral node)</code></p>
<p>This is a list of all present broker nodes, each of which provides a unique logical broker id which identifies it to consumers (which must be given as part of its configuration). On startup, a broker node registers itself by creating a znode with the logical broker id under /brokers/ids. The purpose of the logical broker id is to allow a broker to be moved to a different physical machine without affecting consumers. An attempt to register a broker id that is already in use (say because two servers are configured with the same broker id) is an error.</p>
<p>Since the broker registers itself in ZooKeeper using ephemeral znodes, this registration is dynamic and will disappear if the broker is shutdown or dies (thus notifying consumers it is no longer available).</p>
</blockquote>
</blockquote>
<p>每个broker的信息是保存在zookeeper的<code>/brokers/ids/[id]</code>中的, 其值是该broker的一些信息, 例如</p>
<pre><code>{
"jmx_port": -1,
"timestamp": "1433071965453",
"host": "qc-bj2-kafka4",
"version": 1,
"port": 9092
}
</code></pre><p>这里用到的<em>id</em>就是配置文件中需要配置的<em>broker.id</em>了</p>
<p>同时, 因为这个<code>/brokers/ids/[id]</code>是一个<em>ephemeral node</em>, 所以可以用它来实现kafka broker的健康检查, 即watch /brokers/ids 节点, 当有子节点的变化的时候则通知相应的服务, 具体可以参见kakfa源码中的<code>kafka.server.KafkaHealthcheck</code>类.</p>
<p>注: kafka的java client已经通过这种方式来自动感知broker的变化了.</p>
<p>这里还有个小问题是默认情况下, kafka broker是对外暴露的是<em>hostname</em>, 这就要求集群中配置好DNS或者每个机器都要维护好<em>/etc/hosts</em>, 比较麻烦, 或者如果通过VPN连接到集群中的话, 也会遇到本地机器无法通过hostname来访问到kafka broker的问题.</p>
<p>这个问题可以通过配置<code>advertised.host.name</code>属性为broker ip来解决</p>
<h2 id="自动分配Broker-ID"><a href="#自动分配Broker-ID" class="headerlink" title="自动分配Broker ID"></a>自动分配Broker ID</h2><p>因为一个Kafka Cluster中的broker id不能够重复, 这就给自动部署引起了很大的麻烦, 因为集群中的每个节点都需要一份不同的配置文件了. </p>
<p>例如, Sematext[^1]的人就<a href="http://search-hadoop.com/m/4TaT4dTPKi1">提问了</a>, 他们是把所有的服务都封装进一个VM里面了, 这样的话, 部署就很方便了, 直接把VM跑起来就可以, 但是当需要scale out的时候, 问题出来了, 因为VM是同一个, 每个VM实例中的配置文件自然也就相同, 于是kafka cluster跑不起来……</p>
<h3 id="自己动手丰衣足食"><a href="#自己动手丰衣足食" class="headerlink" title="自己动手丰衣足食"></a>自己动手丰衣足食</h3><p>不过广大人民的智慧是无穷的, 你kafka不就是要求<code>broker.id</code>是一个小于<code>Integer.MAX_VALUE</code>的不重复自然数么, 啥符合要求呢? IP地址啊,集群中的每个机器的IP肯定是不一样的, 那么去掉每个机器IP地址中间的点, 自然就是在一个不重复的数字了.</p>
<p>不过因为<code>Integer.MAX_VALUE=2147483647</code>, 而IP最大的为<code>255255255255</code>, 比要求的大了两个数量级呢, 还是有一定风险的, 但是因为自己的系统的IP号段分配状况自己知道, 所以很容易就可以判断出这种方案可不可行.</p>
<p>如果IP号段符合的话(也就是所有自己集群中可用的IP地址去掉其中的句点之后的数字都比2147483647)小的话, 那就可以先用一个配置文件去部署kafka, 在启动前再用个脚本去获取IP地址然后去更新配置文件就行了, Puppet, Chef之类的工具也很容易的能够做到这一点.</p>
<p>这个方案的变种还有使用MAC地址之类的, 就不多说了.</p>
<h3 id="KAFKA-1070"><a href="#KAFKA-1070" class="headerlink" title="KAFKA-1070"></a><a href="https://issues.apache.org/jira/browse/KAFKA-1070">KAFKA-1070</a></h3><p>需要的人多了, 于是乎, 就有人在Kafka 的JIRA上提了这个改进的需求[^2]</p>
<p>[^1]: Sematext是美国的一个APM服务提供商, 其提供kafka的监控服务<br>[^2]: 虽然这个JIRA的类型是Bug, 但是我认为实际上应该是Improvement或者New Feature的, 因为Bug的定义是行为和承诺不符, 如果文档中写了kafka会自动分配broker id, 却没有自动分配或者分配了重复的ID, 那么是一个bug, 可是现在kafka的文档中明明写着需要用户自己配置broker.id的属性, 所以并不存在行为和预期不符的情况, 这个JIRA更多的是需要kafka提供一个新的功能来自动分配broker id, 所以应该Improvement或者New Feature.</p>
<h2 id="启用JMX"><a href="#启用JMX" class="headerlink" title="启用JMX"></a>启用JMX</h2><p>可以在kafka-run-class.sh的脚本中加入下面两行的方式来启用kafka的JMX支持</p>
<pre><code>export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
export JMX_PORT=${JMX_PORT:-9999}
</code></pre><p>另外, 可以<a href="http://sourceforge.net/projects/mx4j">下载MX4j</a>并把其中的<strong>mx4j-tools.jar</strong>放到kafka的libs目录下, kafka会自动加载的.</p>
<p>MX4j能够提供给我们一种通过Web方式来访问系统的JMX服务, 避免了通过jconsole, jvisualvm的麻烦, 这样我们就能够直接在web端通过标准的JMX服务来查看或者动态调整一些系统参数和指标了.</p>
<p>MX4j不仅在kafka中有所应用, 在其他很多开源项目中也都有被使用, 例如<a href="http://wiki.apache.org/cassandra/Operations#Monitoring_with_MX4J">cassandra</a></p>
<p>因为MX4j提供的是一个web服务, 所以需要制定端口号和绑定的IP</p>
<p>在kafka中, 是通过<code>-Dmx4jport=8082</code>和<code>-Dmx4jaddress=0.0.0.0</code>来完成的, 这两个也是kafka中的默认值, 具体实现可以参考kafka源码中的<code>kafka.utils.Mx4jLoader</code>类.</p>
<p>最常用的情景是我们可以通过JMX的方式来动态的调整一个类的log level, 在定位系统问题的时候会很有帮助.</p>
<h2 id="监控"><a href="#监控" class="headerlink" title="监控"></a>监控</h2><p><a href="https://github.com/criteo/kafka-ganglia">https://github.com/criteo/kafka-ganglia</a></p>
<h2 id="replica相关的参数"><a href="#replica相关的参数" class="headerlink" title="replica相关的参数"></a>replica相关的参数</h2><ul>
<li><p>default.replication.factor (1)</p>
<p> The default replication factor for automatically created topics </p>
<p> 默认的副本数</p>
</li>
<li><p>replica.lag.time.max.ms (10000)</p>
<p> follower的最大lag时间,即如果leader在这个时间内都没有收到follower的fetch请求,就认为它dead </p>
<p> If a follower hasn’t sent any fetch requests for this window of time, the leader will remove the follower from ISR (in-sync replicas) and treat it as dead. </p>
</li>
<li><p>replica.lag.max.messages (4000)</p>
<p> 最大lag消息数,超过这个消息数,leader会认为该follower dead </p>
<p> If a replica falls more than this many messages behind the leader, the leader will remove the follower from ISR and treat it as dead.</p>
</li>
<li><p>replica.socket.timeout.ms (30 * 1000)</p>
<p> The socket timeout for network requests to the leader for replicating data. </p>
</li>
<li><p>replica.socket.receive.buffer.bytes (64 * 1024)</p>
<p> The socket receive buffer for network requests to the leader for replicating data.</p>
</li>
<li><p>replica.fetch.max.bytes (1024 * 1024)</p>
<p> 一次fetch request最大可以fetch的数据size </p>
<p> The number of byes of messages to attempt to fetch for each partition in the fetch requests the replicas send to the leader. </p>
</li>
<li><p>replica.fetch.wait.max.ms (500)</p>
<p> fetch request的等待超时 </p>
<p> The maximum amount of time to wait time for data to arrive on the leader in the fetch requests sent by the replicas to the leader. </p>
</li>
<li><p>replica.fetch.min.bytes (1)</p>
<p> Minimum bytes expected for each fetch response for the fetch requests from the replica to the leader. If not enough bytes, wait up to replica.fetch.wait.max.ms for this many bytes to arrive.</p>
</li>
<li><p>num.replica.fetchers (1)</p>
<p> follower上用于同步leader数据的线程数 </p>
<p> Number of threads used to replicate messages from leaders. Increasing this value can increase the degree of I/O parallelism in the follower broker.</p>
</li>
<li><p>replica.high.watermark.checkpoint.interval.ms (5000)</p>
<p> checkpoint HW的interval </p>
<p> The frequency with which each replica saves its high watermark to disk to handle recovery.</p>
</li>
</ul>
</div>
<div class="post-footer">
<div class="post-eof"></div>
</div>
</div>
<div class="post post-type-normal ">
<div class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="/2015/05/02/Mac-初始化指南/">
Mac 初始化指南
</a>
</h1>
<div class="post-meta">
<span class="post-time">
发表于 2015-05-02
</span>
<span class="post-comments-count">
|
<a href="/2015/05/02/Mac-初始化指南/#comments" >
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/05/02/Mac-初始化指南/"></span>
</a>
</span>
</div>
</div>
<div class="post-body">
<h3 id="安装xcode-command-line"><a href="#安装xcode-command-line" class="headerlink" title="安装xcode command line"></a>安装xcode command line</h3><pre><code>xcode-select --install
</code></pre><h3 id="安装rvm"><a href="#安装rvm" class="headerlink" title="安装rvm"></a>安装<a href="http://rvm.io">rvm</a></h3><pre><code>curl -sSL https://get.rvm.io | bash -s stable
</code></pre><h3 id="安装brew"><a href="#安装brew" class="headerlink" title="安装brew"></a>安装<a href="http://brew.sh">brew</a></h3><pre><code>ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
</code></pre><h3 id="安装brew-cask"><a href="#安装brew-cask" class="headerlink" title="安装brew cask"></a>安装<a href="http://caskroom.io">brew cask</a></h3><pre><code>brew install caskroom/cask/brew-cask
</code></pre><h3 id="通过brew安装的工具"><a href="#通过brew安装的工具" class="headerlink" title="通过brew安装的工具"></a>通过brew安装的工具</h3><pre><code>brew install ansible
brew install ctags
brew install git
brew install libev
brew install libyaml
brew install readline
brew install vim
brew install ant
brew install curl
brew install gmp4
brew install libevent
brew install maven
brew install redis
brew install wget
brew install autoconf
brew install dos2unix
brew install gnu-sed
brew install libgpg-error
brew install mpfr2
brew install scala
brew install wxmac
brew install automake
brew install ejabberd
brew install go
brew install libksba
brew install openssl
brew install sqlite
brew install xz
brew install boost
brew install erlang
brew install gradle
brew install libmpc08
brew install pcre
brew install ssh-copy-id
brew install brew-cask
brew install gcc46
brew install htop-osx
brew install libpng
brew install pkg-config
brew install thrift
brew install cassandra
brew install gdbm
brew install jpeg
brew install libtiff
brew install ppl011
brew install tmux
brew install cloog-ppl015
brew install gettext
brew install legit
brew install libtool
brew install python3
brew install unixodbc
</code></pre><h3 id="通过brew-cask安装应用程序"><a href="#通过brew-cask安装应用程序" class="headerlink" title="通过brew cask安装应用程序"></a>通过brew cask安装应用程序</h3><pre><code>brew cask install adium
brew cask install firefox
brew cask install limechat
brew cask install skype
brew cask install xquartz
brew cask install alfred
brew cask install github
brew cask install mou
brew cask install textmate
brew cask install youdao
brew cask install android-file-transfer
brew cask install google-chrome
brew cask install mplayerx
brew cask install thunder
brew cask install bittorrent-sync
brew cask install onyx
brew cask install vagrant
brew cask install emacs
brew cask install intellij-idea
brew cask install picasa
brew cask install virtualbox
brew cask install evernote
brew cask install libreoffice
brew cask install qq
brew cask install wechat
</code></pre><h3 id="配置zsh"><a href="#配置zsh" class="headerlink" title="配置zsh"></a>配置zsh</h3><p>我使用的是<a href="https://github.com/robbyrussell/oh-my-zsh">oh-my-zsh</a>的配置</p>
<h3 id="配置vim"><a href="#配置vim" class="headerlink" title="配置vim"></a>配置vim</h3><p>vim我选择的是<a href="https://github.com/amix/vimrc">amix的配置</a></p>
<h3 id="配置tmux"><a href="#配置tmux" class="headerlink" title="配置tmux"></a>配置tmux</h3><p>这个基本上就是标准配置了, 只不过改了快捷键</p>
</div>
<div class="post-footer">
<div class="post-eof"></div>
</div>
</div>
<div class="post post-type-normal ">
<div class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="/2015/04/02/青云-阿里云-腾讯云内网网速测试/">
青云,阿里云, 腾讯云内网网速测试
</a>
</h1>
<div class="post-meta">
<span class="post-time">
发表于 2015-04-02
</span>
<span class="post-comments-count">
|
<a href="/2015/04/02/青云-阿里云-腾讯云内网网速测试/#comments" >
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/04/02/青云-阿里云-腾讯云内网网速测试/"></span>
</a>
</span>
</div>
</div>
<div class="post-body">
<p>今天使用<a href="https://github.com/esnet/iperf">iperf3</a>来测试了一下现在国内主流的三大IaaS厂商的内网通讯速度, 发现阿里云最慢啊.</p>
<blockquote>
<blockquote>
<p>注: 这并不是一个非常严谨的测试, 个人不承担相应的责任, 不过自己在考虑使用哪个平台的云服务的时候, 很是一个指标.</p>
</blockquote>
</blockquote>
<p>我们的服务有很多内网之间通讯的需求, 例如, cassandra数据节点之间的同步, 调用zookeeper, 发送消息到kafka中等等, 都需要使用大量的网络带宽, 所以也比较重视这一点.</p>
<p>具体的测试结果见图片:</p>
<h2 id="阿里云的测试结果"><a href="#阿里云的测试结果" class="headerlink" title="阿里云的测试结果"></a>阿里云的测试结果</h2><p><img src="/images/network-speed-cloud/ali.jpg" alt="ali"></p>
<h2 id="腾讯云的测试结果"><a href="#腾讯云的测试结果" class="headerlink" title="腾讯云的测试结果"></a>腾讯云的测试结果</h2><p><img src="/images/network-speed-cloud/qq.jpg" alt="qq"></p>
<h2 id="青云的测试结果"><a href="#青云的测试结果" class="headerlink" title="青云的测试结果"></a>青云的测试结果</h2><p><img src="/images/network-speed-cloud/qing-cloud.jpg" alt="qing"></p>
<p>从图中就可以看出, 阿里云几乎比另外两家慢了一倍, 而青云和腾讯云相比则略胜一筹.</p>
<p>另外, 发现<a href="https://github.com/esnet/iperf">iperf3</a>真是个好东西啊, 用来模拟各种网络情况, 具体见下面的各种配置参数</p>
<pre><code>-u, --udp use UDP rather than TCP
-b, --bandwidth #[KMG][/#] target bandwidth in bits/sec
(default 1 Mbit/sec for UDP, unlimited for TCP)
(optional slash and packet count for burst mode)
-t, --time # time in seconds to transmit for (default 10 secs)
-n, --num #[KMG] number of bytes to transmit (instead of -t)
-k, --blockcount #[KMG] number of blocks (packets) to transmit (instead of -t or -n)
-l, --len #[KMG] length of buffer to read or write
(default 128 KB for TCP, 8 KB for UDP)
-P, --parallel # number of parallel client streams to run
-R, --reverse run in reverse mode (server sends, client receives)
-w, --window #[KMG] TCP window size (socket buffer size)
-B, --bind <host> bind to a specific interface or multicast address
-C, --linux-congestion <algo> set TCP congestion control algorithm (Linux only)
-M, --set-mss # set TCP maximum segment size (MTU - 40 bytes)
-N, --nodelay set TCP no delay, disabling Nagle's Algorithm
-4, --version4 only use IPv4
-6, --version6 only use IPv6
-S, --tos N set the IP 'type of service'
-L, --flowlabel N set the IPv6 flow label (only supported on Linux)
-Z, --zerocopy use a 'zero copy' method of sending data
-O, --omit N omit the first n seconds
-T, --title str prefix every output line with this string
--get-server-output get results from server
</code></pre>
</div>
<div class="post-footer">
<div class="post-eof"></div>
</div>
</div>
<div class="post post-type-normal ">
<div class="post-header">
<h1 class="post-title">
<a class="post-title-link" href="/2015/03/02/We-re-Hiring/">
We're Hiring
</a>
</h1>
<div class="post-meta">
<span class="post-time">
发表于 2015-03-02
</span>
<span class="post-comments-count">
|
<a href="/2015/03/02/We-re-Hiring/#comments" >
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/03/02/We-re-Hiring/"></span>
</a>
</span>
</div>
</div>
<div class="post-body">
<h2 id="环信最新招聘信息"><a href="#环信最新招聘信息" class="headerlink" title="环信最新招聘信息"></a><a href="http://www.easemob.com">环信</a>最新招聘信息</h2><h3 id="后台工程师"><a href="#后台工程师" class="headerlink" title="后台工程师"></a>后台工程师</h3><p>职责描述:</p>
<p>负责环信后台服务器程序的架构设计和开发</p>
<p>任职要求:</p>
<ol>
<li>5年以上java开发工作经验,具有服务器开发工作经验者优先;</li>
<li>深入了解java开发工具及主流开发框架,具有扎实的技术功底,熟悉主流技术架构;</li>
<li>熟悉REST架构和HTTP协议,以及Nginx等;</li>
<li>熟悉Cassandra, Kafka,Zookeeper等流行的分布式系统及其架构;</li>
<li>熟悉TCP/IP协议,熟悉socket和多线程开发,具备高访问量web开发工作经验(10W同时在线或日PV达千万);</li>
<li>逻辑思维能力强,具有团队意识;</li>
<li>熟悉linux相关开发优先考虑;</li>
<li>熟悉ruby, python, bash 等脚本语言优先考虑;</li>
<li>有开源社区经验者优先考虑</li>
<li>全栈工程师,DevOps直接录取</li>
</ol>
<h3 id="前端工程师"><a href="#前端工程师" class="headerlink" title="前端工程师"></a>前端工程师</h3><p>职责描述:</p>
<p>负责环信网站, 管理后台, web im sdk等的开发设计</p>
<p>任职要求:</p>
<ol>
<li>熟悉流行的前端技术, 包括但不限于bootstrap, html5, css3, saas, less, jquery, bower, grunt</li>
<li>熟悉AJAX, REST等原理和使用方式</li>
<li>熟悉HTTP, WebSocket, Spdy等协议</li>
<li>熟悉Haml, Jade, Slim等模板语言优先考虑</li>
<li>有设计美感者优先考虑</li>
<li>深刻理解Web标准,对可用性. 可访问性等相关知识有实际的了解和实践经验;</li>
<li>熟悉ruby, python, bash, nodejs 等脚本语言优先考虑;</li>
<li>有开源社区经验者优先考虑</li>
<li>全栈工程师,DevOps直接录取</li>
</ol>
<h3 id="运维工程师"><a href="#运维工程师" class="headerlink" title="运维工程师"></a>运维工程师</h3><p>职责描述:</p>
<ol>
<li>负责网站应用的架构审核,监控,优化,排错.</li>
<li>能够快速定位故障的位置,原因和提供解决方案.</li>
<li>给其他工程师提供支持和帮助,促进团队的学习和提高.</li>
<li>跟踪业内新技术新动态,研究相关应用架构和运维技术,制定运维技术方案.</li>
<li>研究和建立运维系统,推动运维系统的规范化,标准化,自动化和智能化.</li>
<li>提升应用的速度,稳定性,可靠性,安全性,降低成本.</li>
</ol>
<p>任职要求:</p>
<ol>
<li>精通Linux以及主要Unix系统及原理,了解网络基本技术,熟悉TCP/IP协议工作原理;</li>
<li>熟悉nginx, tomcat, cassandra, zookeeper等技术的原理,优化,排错;</li>
<li>熟悉shell, perl, python, java, php, C++脚本或开发语言两种以上.</li>
<li>熟悉大型网站架构及优化,分布式系统,大型数据库,缓存,队列,运维系统架构等技术;</li>
<li>责任心强,积极主动,研究规划能力强,沟通和团队建设能力强,热爱分享.</li>
<li>有开源社区经验者优先考虑</li>
<li>全栈工程师,DevOps直接录取</li>
</ol>
</div>
<div class="post-footer">
<div class="post-eof"></div>
</div>
</div>
</div>
</div>
</div>
<div class="sidebar-toggle">
<div class="sidebar-toggle-line-wrap">
<span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
</div>
</div>
<div id="sidebar" class="sidebar">
<div class="sidebar-inner">
<div class="site-overview">
<div class="site-author motion-element">
<img class="site-author-image" src="https://avatars0.githubusercontent.com/u/174662?v=3&s=200" alt="Strong Liu" />
<p class="site-author-name">Strong Liu</p>
</div>
<p class="site-description motion-element"></p>
<div class="site-state motion-element">
<div class="site-state-item site-state-posts">
<a href="/archives">
<span class="site-state-item-count">4</span>
<span class="site-state-item-name">日志</span>
</a>
</div>
<div class="site-state-item site-state-categories">
<span class="site-state-item-count">0</span>
<span class="site-state-item-name">分类</span>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags">
<span class="site-state-item-count">6</span>
<span class="site-state-item-name">标签</span>
</a>
</div>
</div>
<div class="links-of-author motion-element">
<span class="links-of-author-item">
<a href="https://github.com/stliu" target="_blank">GitHub</a>
</span>
<span class="links-of-author-item">
<a href="https://twitter.com/strongliu" target="_blank">Twitter</a>
</span>
<span class="links-of-author-item">
<a href="http://www.douban.com/people/rain2sunny/" target="_blank">DouBan</a>
</span>
<span class="links-of-author-item">
<a href="http://www.zhihu.com/people/strong-liu" target="_blank">ZhiHu</a>
</span>
</div>
<div class="cc-license motion-element">
<a href="http://creativecommons.org/licenses/by-nc-sa/4.0" class="cc-opacity" target="_blank">
<img src="/images/cc-by-nc-sa.svg" alt="Creative Commons" />
</a>
</div>
</div>
</div>
</div>
</div>
<div id="footer" class="footer">
<div class="footer-inner">
<div class="copyright">
© 2011 -
2016
<span class="with-love">
<i class="icon-heart"></i>
</span>
<span class="author">Strong Liu</span>
</div>
<div class="powered-by">
由 <a class="theme-link" href="http://hexo.io">Hexo</a> 强力驱动
</div>
<div class="theme-info">
主题 -
<a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
NexT
</a>
</div>
</div>
</div>
<div class="back-to-top"></div>
</div>
<script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>
<script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js"></script>
<script type="text/javascript" src="/js/fancy-box.js"></script>
<script type="text/javascript" src="/js/helpers.js"></script>
<script type="text/javascript" src="/vendors/velocity/velocity.min.js"></script>
<script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js"></script>
<script type="text/javascript" src="/js/motion_global.js" id="motion.global"></script>
<script type="text/javascript">
$(document).ready(function () {
if (CONFIG.sidebar === 'always') {
displaySidebar();
}
});
</script>
<script type="text/javascript">
var disqus_shortname = 'baasim';
var disqus_identifier = 'index.html';
var disqus_title = '';
var disqus_url = '';
(function(){
var dsq = document.createElement('script');
dsq.type = 'text/javascript';
dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/count.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
}());
</script>
</body>
</html>