- Better
3)Fail-safe
4)Fail-back
5)Forking
6)其他
16 如何压榨性能(Don’t trust it,Test it)
1)ASM 写个 FastMethodAccessor 来代替服务端那个反射调用
2)序列化/反序列化
在业务线程中序列化/反序列化,避免占用 IO 线程:
- 序列化/反序列化占用数量极少的 IO 线程时间片。
- 反序列化常常会涉及到 Class 的加载,loadClass 有一把锁竞争严重(可通过 JMC 观察一下)。
选择高效的序列化/反序列化框架:
- 如kryo/protobuf/protostuff/hessian/fastjson/…
选择只是第一步,它(序列化框架)做的不好的,去扩展和优化之:
- 传统的序列化/反序列化 写入/读取网络的流程:java对象--> byte[] -->堆外内存 / 堆外内存--> byte[] -->java对象。
- 优化:省去 byte[] 环节,直接 读/写 堆外内存,这需要扩展对应的序列化框架。
- String 编码/解码优化。
- Varint 优化:多次 writeByte 合并为 writeShort/writeInt/writeLong。
- Protostuff 优化举例:UnsafeNioBufInput 直接读堆外内存/UnsafeNioBufOutput 直接写堆外内存。
3)IO 线程绑定 CPU
4)同步阻塞调用的客户端和容易成为瓶颈,客户端协程:
- Java层面可选的并不多,暂时也都不完美。
5)Netty Native Transport & PooledByteBufAllocator:
- 减小GC带来的波动。
6)尽快释放 IO 线程去做他该做的事情,尽量减少线程上下文切换。
四 Why Netty?1 BIO vs NIO