Socket分片:基于Netty的Java实现

最近Nginx发布了1.9.1版,其中一个新的特性就是支持socket的SO_REUSEPORT选项。这个socket的SO_REUSEPORT选项已经有许多现实世界的应用。对NGINX而言,它通过将连接均衡的分给多个进程以提升性能。SO_REUSEPORT已经在一些操作系统上实现了支持。这个选项允许多个socket监听同一个IP地址+端口。内核负载均衡这些进来的sockets连接,将这些socket有效的分片。
尽管Java很早就有一个特性请求:JDK-6432031,但是时至今日,Oracle JDK依然不支持这个选项,因此我们只能通过hack的方式在Java中使用此特性。

Google已经在内部服务器中开启了这个特性: SO_REUSEPORT
Scaling Techniques for Servers with High Connection Rates

阅读全文

流量调整和限流技术

最近看到一些限流的文章,特地整理了一下相关的知识。
在早期的计算机领域,限流技术(time limiting)被用作控制网络接口收发通信数据的速率。 可以用来优化性能,减少延迟和提高带宽等。
现在在互联网领域,也借鉴了这个概念, 用来为服务控制请求的速率, 如果双十一的限流, 12306的抢票等。
即使在细粒度的软件架构中,也有类似的概念。 比如Java线程池可以用Bounded queues保存待执行的任务, 一旦超过queue的容量, 线程池可以根据配置的策略处理此请求。

阅读全文

循环冗余校验CRC简介

循环冗余校验(英语:Cyclic redundancy check,通称“CRC”)是一种根据网络数据数据包或电脑文件等数据产生简短固定位数校验码的一种散列函數,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方是由W. Wesley Peterson于1961年发表。
CRC为校验和的一种,是两个字节数据流采用二进制除法(没有借位和进位,使用异或来代替减法)相除所得到的余数。其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为(n+1)的预定义二进制数,通常用多项式的系数来表示。在做除法之前,要在信息数据之后先加上n个0. 冗余码的位数是n位。
冗余码的计算方法是,先将信息码后面补0,补0的个数是生成多项式最高次幂;将补零之后的信息码用模二除法(非二进制除法)除以G(X)对应的2进制码,注意除法过程中所用的减法是模2减法,即没有借位的减法,也就是异或运算。当被除数逐位除完时,得到比除数少一位的余数。此余数即为冗余位,将其添加在信息位后便构成CRC码字。

例如,假设信息码字为11100011,生成多项式G(X)=X^5+X^4+X+1,计算CRC码字。G(X) = X^5+X^4+X+1,也就是110011,因为最高次是5,所以,在信息码字后补5个0,变为1110001100000。用1110001100000模二除法除以110011,余数为11010,即为所求的冗余位。
因此发送出去的CRC码字为原始码字11100011末尾加上冗余位11010,即 1110001111010。接收端收到码字后,采用同样的方法验证,即将收到的码字用模二除法除以110011(是G(X)对应的二进制生成码),发现余数是0,则认为码字在传输过程中没有出错。

尽管在错误检测中非常有用,CRC并不能可靠地校验数据完整性(即数据没有发生任何变化),这是因为CRC多项式是线性结构,可以非常容易地故意改变量据而维持CRC不变。

Netty5用户指南

Netty 是一个NIO client/server 网络编程框架, 可以快速且容易的开发基于协议(protocol)的网络客户端/服务器端的程序。 它极大的简化了TCP和UDP socket编程, 提供流水线化的操作。

'快速且容易'并不会导致应用难以维护和性能低下。 Netty经过仔细设计, 基于许多协议实现的经验如FTP, SMTP, HTTP以及各种二进制的和基于本文的老的协议, Netty成功的找到一种保证开发,性能,稳定性,灵活性的方式, 毋须折衷.

特性

设计

  • 为各种传输类型提供统一的API- 阻塞和非阻塞的socket
  • 灵活和可扩展的事件模型, 将关注点分隔
  • 高度可定制化的线程模型- 单线程, 一种或者多个线程池如SEDA
  • 真正无连接的数据报socket支持(since 3.1)

易用

  • 提供Javadoc, 用户指南和例子
  • 除了JDK 1.5 (或以上版本)毋须第三方库支持

性能

  • 更好的吞吐率,低延迟
  • 较少的资源占用
  • 最小化不必要的内存拷贝

安全

  • 完整的SSL/TLS, StartTLS支持

社区

  • 早期发布,发布频繁
  • 作者自2003就开始写类似的框架(mina), 一直收集用户的反馈。

阅读全文