Rabbitmq Java Client Api详解

AMQP

  • AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现。

基础概念快速入门

  • 每个rabbitmq-server叫做一个Broker,等着tcp连接进入。
  • 在rabbitmq-server进程内有Exchange,定义了这个消息的发送类型。(一对多、直连、多对多等等)
  • Queue是进程内的逻辑队列,有多个,有名字。
  • Binding联系Exchane与Queue。
  • Routing key由生产者指定。Binding key由消费者指定。二者联合决定一条消息的来去。

小米互娱招java工程师

  • 这是一个新的时代。
  • 小米互娱作为一个真正意义上的小米互联网部门,开启小米“铁人三项”中互联网征途。
  • 这里有众多靠谱的兄弟。
  • 这里缺更加强大的你的加入。

中国移动网络下连接的秘密

最近在研究网络层的接入问题。一些心得记录在下面:

一、TCP与HTTP

  • 0.所谓长连接短连接(其实都是TCP),都是谣传,在传输层混只有TCP和UDP。
  • 1.TCP传输的数据,绝对是顺序正确、不丢包的数据。否则它一定不会把数据扔给应用层。
  • 2.从应用层角度,TCP是一个数据流,收到的数据会聚在一起。所以需要应用层去协商数据与数据之间用什么间隔,比如常用的长度标识。
  • 3.TCP在网络恶劣的情况下,开始启动:拥塞避免算法 与 慢启动算法。而这些都是由一些公式去估计当前网络情况的。
  • 4.TCP的报文包与我们自己应用层的发的“包”半毛钱关系都没有,数据到了底层还是要切成N块来传送的。
  • 5.所谓的HTTP比TCP更可靠是错误的。HTTP是应用层协议,实际也是TCP,只不过数据在应用层定义了规则:必须有request\header\body等等。
  • 6.硬件防火墙一般拦截端口,软件防火墙才拦协议。所以80端口走TCP有不少好处。
  • 7.HTTP比TCP更可靠的错觉产生的原因是:HTTP请求基本都是每次新开连接,而TCP很少这样做。
  • 8.TCP就像

tigase网络核心SockThread详解

总述

  • SocketThread类是一个很底层的类,在初始化时调用了Selector.open(clientsSel)。
  • socketReadThread nThread个
  • socketWriteThread nThread个
  • ResultsListener nThread个
  • completionService一个,池化线程nThread个,在sockThread.run里被submit,ResultsListener里进行completionService.take().get()取出执行结果。
  • forCompletion有序队列一个,在socketThread.run里开始add,同一方法立即被从最小依次取出,然后submit给completionService。
  • waiting有序队列一个,recreateSelector阶段存在add,最大来源是addSocketService静态方法,在socketThread.run最后阶段的addAllWaiting时注册Channel时把waiting里的IOService取出做为附加对象绑定。

Tigase代码框架解读

  • 在java下实现的xmpp开源实现,除了openfire外,tigase是另一个牛逼的项目。

  • 实际的实验室压力下,50万人同时在线的单机,tigase的gc情况要优于openfire,而且openfire的网络层代码借鉴了不少tigase的。

下面的内容,在解剖tigase过程中所写,使用的版本是:5.2.1 (2014年7月份)。

组件

tigase就是一个大组件框,里面所有东西基本都是组件组成的。session manager、message router、c2s connection manager…全部是组件。

ServerComponent接口是一个最小化接口,但是要去写很多代码,tigase提供了许多的现成的代码,减少去从零实现这个接口的过程。

比如extends AbstractMessageReceiver可以直接生成一个处理消息的组件。只需要实现一个processPacket方法。实现getDefaults方法,可以对系统变量进行处理。实现setProperties方法,可以去设置一些要用的变量。

多线程

processPacket方法,可以把逻辑扔到不同的cpu上去运行,以发挥服务器多核的优势。processingThreads方法返回用多少个cpu来处理。

Bosh vs Comet vs Long Polling vs Polling

最近在研究在中国特色移动互联网下通过性最好的应用层协议办法,看到很多混乱的概念和实现,54chen在对各种名词的历史进行了深度考察,特作记录以做区分。

HTTP协议历史

  • 第一个HTTP协议诞生于1989年3月。
  • 第一个HTTP协议的版本是HTTP 0.9,它的组成极其简单,因为它只允许客户端发送GET这一种请求。
  • HTTP协议的第二个版本是HTTP 1.0,直到HTTP 1.0成为最重要的面向事务的应用层协议。该协议对每一次请求/响应,同样是建立并关闭一次连接。
  • HTTP协议的第三个版本是HTTP 1.1,它就是目前使用最广泛的协议版本。从HTTP 1.1开始,客户端默认与Web 服务器建立长连接。

原始阶段polling

最早期的时候,因为没有可以依赖的东西,能用的只有javascript的setInterval,定时循环向服务器发起请求。

优点是:服务器端啥特别的东西都不用准备,直接当http请求处理即可。缺点是:白白浪费大量的请求。

什么是Comet?

中文意思彗星,大概是想表示这是一次尾巴会拖很长的请求。

Thrift版本升级调查记录

自从0.5.0之后,很长时间thrift的版本都没有动,后来似乎是换了一波人,把java代码部分接口层变动太多,以致于,在0.5.0和其他版本共同存在的情况下,问题较多,54chen特作调查,调查目标0.5.0 vs 0.9.1。

代码位置:https://github.com/54chen/thrift_test

第一轮:编译阶段

安全无小事--技术团队防守一二三

事情的经过是这样的:

那天在使用某创业团队的APP时,输入完了微博账号还需要他自己的账号,于是就发了条微博,

然后就有人@我是不是在说小米被脱库的事。。。呵呵!

这里要讨论的是,如何让数千计的开发人员在安全防守安全编程上,得到有效的效果。有人说,我干了xx年,手上从来没有一个项目出过安全漏洞; 还有人说,我一个人做的x项目,也从来没有出现过安全漏洞; 呵呵,集体的智慧不由个人意志来控制,木桶漏水取决于最短的一块。

一、内防

线上JVM调查工具:JCPU和JMEM

之前的jkiller改名为jcpu,然后再加上jmem,齐活了,线上要再遇到问题,内存和CPU之外的也没啥其他办法了。

JMEM

https://github.com/54chen/jmem

用来定位莫名其妙的堆外内存问题。首先还是要先用jmap之类的看清楚是否是JVM堆内问题了再用此神物。

Java中使用akka手记四 用法速查

Actor

  • UntypedActor actor的基类,继承并实现onReceive方法就可以得到一个Actor。
  • Props 配置类,用Props.create可以创建一个按指定配置生成的Actor。
  • Props的推荐实践,创建Actor时,搞一个static的Props.create方法。可以少写不少重复代码。
  • system.actorOf 会创建顶级的actor,将被系统监控。
  • getContext().acrtorOf 会创建子actor。
  • ActorRef 由actorOf产生,可以是一个网络actor。
  • ActorRef.forward与tell、ask的区别,性能最好的是tell,发完就走。ask是发完等Future,要等的话性能是个问题。forward用于从一个actor转发消息给另一个actor,原始的sender信息会被保留,在>做路由、负载均衡、备份时非常有用。ask会拦住reply消息直接给onsuccess等,sender不会再得到reply。
  • Inbox 当actor不能满足需要时,可以使用inbox,比如收多个回复,watch其他actor的生命周期。