
本文描述了 Java7 中 keytool 工具的使用方法,并结合具体代码片段,向读者阐述如何使用 JSSE 提供的 API 进行安全套接字编程,以及如何进行 SSL/TSL 程序调试等技巧,让读者可以学以致用。
原文地址: Java 安全套接字编程以及 keytool 使用最佳实践。 作者: 赵映洁
本文描述了 Java7 中 keytool 工具的使用方法,并结合具体代码片段,向读者阐述如何使用 JSSE 提供的 API 进行安全套接字编程,以及如何进行 SSL/TSL 程序调试等技巧,让读者可以学以致用。
原文地址: Java 安全套接字编程以及 keytool 使用最佳实践。 作者: 赵映洁
PartialFunction
是Scala另一个有趣的函数,也非常的有用。
一个PartialFunction[A, B]
类型的函数是一个一元函数,接收一个类型为A的参数,返回类型为B的值。但是X的值域可以不覆盖A的整个值域,可以只覆盖部分的值域。其中isDefinedAt
可以测试是否一个值是否落在了定义的参数值域上。
如果用简单的白话来讲,就是一个PartialFunction
只处理参数的一个子集。
最近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
最近在调研Scala web框架的性能时遇到一些问题, 比如生成巨多的Actor,GC时间过长,CPU使用率太高, 执行Actor的Receive是遇到耗时操作的问题等。怀疑Akka的调度器有些问题,特意整理了一些Akka调度器的背景知识,以及从源代码分析一下Actor是怎么执行地。
事实上,最近我又增加了几个框架,现在包括 Netty, Undertow, Jetty, Spray, Vert.x, Grizzly 和 Node.js七种框架。
测试数据可以看下一篇文章: 七种WebSocket框架的性能比较
著名的 C10K 问题提出的时候, 正是 2001 年。这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务这个问题,当时因为硬件和软件的限制,单机1万还是一个非常值得挑战的目标。但是时光荏苒,随着硬件和软件的飞速发展,单机1万的目标已经变成了最简单不过的事情。现在用任何一种主流语言都能提供单机1万的并发处理的能力。所以现在目标早已提高了100倍,变成C1000k,也就是一台服务器为100万连接提供服务。在2010年,2011年已经看到一些实现C1000K的文章了,所以在2015年,实现C1000K应该不是一件困难的事情。
本文是我在实践过程中的记录,我的目标是使用spran-websocket,netty, undertow和node.js四种框架分别实现C1000K的服务器,看看这几个框架实现的难以程度,性能如何。开发语言为Scala和Javascript。
当然,谈起性能,我们还必须谈到每秒每个连接有多少个请求,也就是RPS数,还要考虑每条消息的大小。
一般来说,我们会选取一个百分比,比如每秒20%的连接会收发消息。我的需求是服务器只是push
,客户端不会主动发送消息。 一般每一分钟会为这一百万群发一条消息。
所以实现的测试工具每个client建立60000个websocket连接,一共二十个client。实际不可能使用20台机器,我使用了两台AWS C3.2xlarge(8核16G)服务器作为客户端机。每台机器10个客户端。
服务器每1分钟群发一条消息。消息内容很简单,只是服务器的当天时间。
最近看到360用Go实现的消息推送系统,下面是他们的数据:
目前360消息推送系统服务于50+内部产品,万款开发平台App,实时长连接数亿量级,日独数十亿量级,1分钟内可以实现亿量级广播,日下发峰值百亿量级,400台物理机,3000多个实例分布在9个独立集群中,每个集群跨国内外近10个IDC。
四个服务器的代码和Client测试工具代码可以在github上下载。 (其实不止四种框架了,现在包括Netty, Undertow, Jetty, Spray-websocket, Vert.x, Grizzly 和 Node.js 七种框架的实现)
测试下来可以看到每种服务器都能轻松达到同时120万的websocket活动连接,只是资源占用和事务处理时间有差别。120万只是保守数据,在这么多连接情况下服务器依然很轻松,下一步我会进行C2000K的测试。
最近在使用Metrics测试服务器性能的时候,Histogram类型会统计下面的数据:
|
|
特地整理一下几个统计指标(平均值,众数,中值和标准差)的含义。
CQRS全称为Command Query Responsibility Segregation。 CQRS并不是一个完整的架构,而是一个小的模式。这个模式首先由Greg Young 和 Udi Dahan提出,Martin Flower有一篇文章专门介绍这个模式,微软也有一个专门教程介绍CQRS。
CQRS描述起来很简单,就是命令和查询职责分离。
Scala中的协变逆变和Java中的协变逆变不一样,看起来更复杂。 本文对Scala中的这些概念做一总结。
首先看几个概念: