归档之于 ‘ 2014 年5 月 ’
《Netty 权威指南》样章
声明:本文是《Netty 权威指南》的样章目录,感谢博文视点授权并发编程网站发布样章,禁止以任何形式转载此文。
第 2 章 NIO入门
在本章节,我们分别对JDK的BIO、NIO和JDK1.7最新提供的NIO2.0的使用进行详细说明,通过流程图和代码讲解,让大家体会到随着Java IO类库的不断发展和改进,基于Java的网络编程会变得越来越简单,随着异步IO功能的增强,基于Java NIO开发的网络服务器甚至不逊色于采用C++开发的网络程序。
本章主要内容包括:
- 传统的同步阻塞式IO编程
- 基于NIO的非阻塞编程
- 基于NIO2.0 的异步非阻塞(AIO)编程
- 为什么要使用NIO编程
- 为什么选择Netty
Web Service 消息格式
当客户端和Web Service服务器进行通信时,他们交换消息。客户端发送请求消息到Web Service服务器。 Web Service服务器响应并返回消息。这就像普通的HTTP,浏览器发送一个HTTP请求到Web服务器, Web服务器会提供一个HTTP响应。
最初唯一可用的Web Service消息格式是SOAP,后来出现了REST式的Web Service,它采用纯XML和HTTP。随着REST的兴起,出现了很多人使用JSON(JavaScript对象符号)作为消息格式。另外一个很简单的远程协议被称为XML-RPC(XML远程过程调用)。 对最常见的是SOAP协议我不会在这里详述消息格式细节,因为在后续的教程中会提到。在这里,我只是简单提一下。
客户端发送请求到web服务,并且接收web服务的响应
自旋锁代替互斥锁的实践
自旋锁和互斥锁是多线程程序中的重要概念。 它们被用来锁住一些共享资源, 以防止并发访问这些共享数据时可能导致的数据不一致问题。 但是它们的不同之处在哪里? 我们应该在什么时候用自旋锁代替互斥锁?
理论分析
从理论上说, 如果一个线程尝试加锁一个互斥锁的时候没有成功, 因为互斥锁已经被锁住了, 这个未获取锁的线程会休眠以使得其它线程可以马上运行。 这个线程会一直休眠, 直到持有锁的线程释放了互斥锁, 休眠的线程才会被唤醒。 如果一个线程尝试获得一个自旋锁的时候没有成功, 该线程会一直尝试加锁直到成功获取锁。 因此它不允许其它线程运行(当然, 操作系统会在该线程所在的时间片用完时, 强制切换到其它线程)。 阅读全文
并发数据结构
《Concurrent Data Structures》(并发数据结构)一文是Mark Moir和Nir Shavit所撰写的一篇有关并发数据结构的综述性文章。这篇文章从多核处理器基础开始,理清了并发数据结构的基础设计理念和技巧,介绍了数据结构算法相关的正确性证明,并列举了栈,链表,队列,树等常用并发数据结构的设计思路。
为了促进大家对并发数据结构基础概念的了解,并发编程网组织译者翻译该论文。由于时间仓促,如有不到位的地方,还请各位指出。
感谢下列译者:董明鑫,俞升兵,Noodles,张军,huavben,iDestiny,郭振斌 阅读全文
Web基础架构:负载均衡和LVS
感谢同事【沐剑】的投稿
在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库、缓存等等)。
一、负载均衡的作用
负载均衡设备的任务就是作为应用服务器流量的入口,首先挑选最合适的一台服务器,然后将客户端的请求转发给这台服务器处理,实现客户端到真实服务端的透明转发。最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不需要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的,是后端的集群。
一个典型的互联网应用的拓扑结构是这样的:
Map or switch
感谢同事 {空蒙}的投稿
最近碰到个场景,还蛮有普遍性的,如mtop的请求入口非常多,有api2,api3,api4,h5,h5update,cdn_cache,bigpipe等,而Mtop需要依据其具体的入口,选择不同的业务逻辑进行对应的处理。
马上想到两个方案:
- 方案一:采用map存放对应入口的处理方法,然后请求进来后经过get就行,map.get(et);
- 方案二:采用switch语句。