‘ JAVA ’ 目录归档
《Netty 权威指南》—— AIO 创建的TimeServer源码分析
声明:本文是《Netty 权威指南》的样章,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文。
NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取获取操作结果:
- 通过java.util.concurrent.Future类来表示异步操作的结果;
- 在执行异步操作的时候传入一个java.nio.channels.
CompletionHandler接口的实现类作为操作完成的回调。
NIO2.0的异步套接字通道是真正的异步非阻塞IO,它对应Unix网络编程中的事件驱动IO(AIO),它不需要通过多路复用器(Selector)对注册的通道进行轮询操作即可实现异步读写,简化了NIO的编程模型。
下面还是通过代码来熟悉NIO2.0 AIO的相关类库,我们仍旧以时间服务器为例程进行讲解。
Storm入门之附录C
本文翻译自《Getting Started With Storm》译者:吴京润 编辑:郭蕾 方腾飞
安装实际的例子
译者注:有些软件的最新版本已有变化,译文不会完全按照原文翻译,而是列出当前最新版本的软件。
首先,从下述GitHub的URL克隆这个例子:
Storm入门之第8章事务性拓扑
本文翻译自《Getting Started With Storm》译者:吴京润 编辑:郭蕾 方腾飞
正如书中之前所提到的,使用Storm编程,可以通过调用ack和fail方法来确保一条消息的处理成功或失败。不过当元组被重发时,会发生什么呢?你又该如何砍不会重复计算?
Storm0.7.0实现了一个新特性——事务性拓扑,这一特性使消息在语义上确保你可以安全的方式重发消息,并保证它们只会被处理一次。在不支持事务性拓扑的情况下,你无法在准确性,可扩展性,以空错性上得到保证的前提下完成计算。
Map or switch
感谢同事 {空蒙}的投稿
最近碰到个场景,还蛮有普遍性的,如mtop的请求入口非常多,有api2,api3,api4,h5,h5update,cdn_cache,bigpipe等,而Mtop需要依据其具体的入口,选择不同的业务逻辑进行对应的处理。
马上想到两个方案:
- 方案一:采用map存放对应入口的处理方法,然后请求进来后经过get就行,map.get(et);
- 方案二:采用switch语句。
Tomcat7.0.26的连接数控制bug的问题排查
感谢同事[空蒙]的投稿。
首先感谢@烈元一起排查此问题。今天发现线上一台机器,监控一直在告警,一看是健康检查不通过,就上去查看了下,首先自己curl了下应用的url,果然是超时没有响应,那就开始按顺序排查了:
1、 load非常低,2、gc也正常,3、线程上也没死锁,4、日志一切正常。那是什么情况呢,不能忘记网络啊。果然,netstat命令一把,结果如下:
TIME_WAIT 68 CLOSE_WAIT 194 ESTABLISHED 3941 SYN_RECV 100
问题出来了,SYN_RECV竟然达到100个,正常情况下,半连接的请求应该是很小的。而且我们机器是内部的,不是lvs,不太会有半连接攻击,怎么可能达到这么大呢?
聊聊并发(十)生产者消费者模式
本文首发于InfoQ 作者:方腾飞 校对:张龙
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
为什么要使用生产者和消费者模式
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,所以便有了生产者和消费者模式。
什么是生产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
阅读全文