Netty API使用总结

简介: Netty API使用总结

Q1:服务器主动关闭连接后,客户端没有监听到socket关闭的事件。

想象中,调用org.jboss.netty.channel.Channel.close();-->GateServerHandler.closeRequested-->channelDisconnected-->channelClosed-->client

实际上,调用org.jboss.netty.channel.Channel.close();-->GateServerHandler.closeRequested 就停止了,导致游戏实现上,玩家重复登陆,客户端没法收到服务器已经关闭了同一玩家前面建立的连接,所以客户端表现为无法断开与服务器的连接。

后来发现少了这样的一句话,导致closeRequested 就停止了。

public void closeRequested(ChannelHandlerContext ctx, ChannelStateEvent e) {
    ctx.sendDownstream(e);
  }

closeRequested 一般为服务器主动发起的关闭,另外,关于channelDisconnected和channelClosed的区别,看源码:

org.jboss.netty.channel.socket.nio.NioWorker.java

//netty version: 3.1.5GA
//file: org.jboss.netty.channel.socket.nio.NioWorker.java
//method: static void close(NioSocketChannel channel, ChannelFuture future)
//line: 581
future.setSuccess();
if (connected) {
    fireChannelDisconnected(channel);
}
if (bound) {
    fireChannelUnbound(channel);
}
cleanUpWriteBuffer(channel);
fireChannelClosed(channel);

我们可以看到,在上述代码中,在close channel的时候,会先判断当前channel是否处于connected状态,即是否已经成功地与远程地址建立了连接,如果是的话,就触发channelDisconnected事件;最后,再统一触发channelClosed事件。

也就是说,任何对NioWorker.close(NioSocketChannel channel, ChannelFuture future)方法的调用都会触发channelClosed事件,这些事件可能包括如下几种:

1. 已经与远程主机建立的连接,远程主机主动关闭连接,或者网络异常连接被断开的情况

2. 已经与远程主机建立的连接,本地客户机主动关闭连接的情况

3. 本地客户机在试图与远程主机建立连接时,遇到类似与connection refused这样的异常,未能连接成功时

而只有当本地客户机已经成功的与远程主机建立连接(connected)时,连接断开的时候才会触发channelDisconnected事件,即对应上述的1和2两种情况。

上述猜想已经通过编写测试代码,模拟不同的情况得到了证实。

Q2:一个Boss线程(一个服务器端口对于一个)--->接收到客户端连接--->生成Channel--->交给Work线程池(多个Work线程)来处理。

一个连接会绑定一个worker线程,选择的线程算法如下:

public E nextWorker() {

       return (E) workers[Math.abs(workerIndex.getAndIncrement() % workers.length)];

   }

按顺序循坏往复。

这个连接的所有接受消息和发送消息最终都会由这个worker来执行

在写出消息时,如果不是IO线程,则会写入到发消息队列里,由IO worker线程去处理,如果是IO 线程则直接写出去

监控点:UnpooledSendBuffer.transferTo

http://www.haogongju.net/art/2034726

http://xsh5324.iteye.com/blog/1915534

具体的Work线程---读完已接收的数据到ChannelBuffer---触发ChannelPipeline中的ChannelHandler链来处理业务逻辑。

注意:执行ChannelHandler链的整个过程是同步的,如果业务逻辑的耗时较长,会将导致Work线程长时间被占用得不到释放,从而影响了整个服务器的并发处理能力。

所以,为了提高并发数,一般通过ExecutionHandler线程池来异步处理ChannelHandler链(worker线程在经过ExecutionHandler后就结束了,它会被ChannelFactory的worker线程池所回收)。

Boostrap.bind 方法包含两个参数NioServerSocketChannelFactory、ChannelPipelineFactory。NioServerSocketChannelFactory包含连个线程池bossExecutor和workerExecutor,workerExecutor: 包含缺省为处理器个数×2个NioWorker进程。

对于ExecutionHandler需要的线程池模型,Netty提供了两种可选:

1) MemoryAwareThreadPoolExecutor 通过对线程池内存的使用控制,可控制Executor中待处理任务的上限(超过上限时,后续进来的任务将被阻塞),并可控制单个Channel待处理任务的上限,防止内存溢出错误;

2) OrderedMemoryAwareThreadPoolExecutor 是 MemoryAwareThreadPoolExecutor 的子类。除了MemoryAwareThreadPoolExecutor 的功能之外,它还可以保证同一Channel中处理的事件流的顺序性,这主要是控制事件在异步处理模式下可能出现的错误的事件顺序,但它并不保证同一Channel中的事件都在一个线程中执行(通常也没必要)。

Q3:如果压力测试写日志频率较高,会阻塞netty发送消息,需要给日志起单独线程

Q4:默认netty起来后,如果用Executors.newCachedThreadPool(),默认会起1个boss线程,8个work线程,但实际上后台并不需要这么多work,

// Configure the server.

ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),

Executors.newSingleThreadExecutor()));

发现,其他客户端连上来后,断开后,就再也没法连了,

Executors.newSingleThreadExecutor()换成Executors.newFixedThreadPool(1) 就没问题了。

netty客户端这边一个ClientBootstrap  可以连多个server

Q5:字节打印,很漂亮

ByteBufUtil.hexDump(byte[] array)

ByteBufUtil.prettyHexDumpbyte[] array)

目录
相关文章
|
3月前
|
API
Netty API网关实操系列(三)
Netty API网关实操系列(三)
|
3月前
|
存储 运维 架构师
Netty API网关实操系列(二)
Netty API网关实操系列(二)
|
3月前
|
安全 应用服务中间件 API
Netty API网关实操系列(一)
Netty API网关实操系列(一)
|
安全 Java Linux
Netty4 使用总结
Netty4 使用总结
59 0
|
11天前
|
人工智能 自然语言处理 API
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
谷歌推出的Multimodal Live API是一个支持多模态交互、低延迟实时互动的AI接口,能够处理文本、音频和视频输入,提供自然流畅的对话体验,适用于多种应用场景。
59 3
Multimodal Live API:谷歌推出新的 AI 接口,支持多模态交互和低延迟实时互动
|
6天前
|
前端开发 API 数据库
Next 编写接口api
Next 编写接口api
|
13天前
|
XML JSON 缓存
阿里巴巴商品详情数据接口(alibaba.item_get) 丨阿里巴巴 API 实时接口指南
阿里巴巴商品详情数据接口(alibaba.item_get)允许商家通过API获取商品的详细信息,包括标题、描述、价格、销量、评价等。主要参数为商品ID(num_iid),支持多种返回数据格式,如json、xml等,便于开发者根据需求选择。使用前需注册并获得App Key与App Secret,注意遵守使用规范。
|
12天前
|
JSON API 开发者
淘宝买家秀数据接口(taobao.item_review_show)丨淘宝 API 实时接口指南
淘宝买家秀数据接口(taobao.item_review_show)可获取买家上传的图片、视频、评论等“买家秀”内容,为潜在买家提供真实参考,帮助商家优化产品和营销策略。使用前需注册开发者账号,构建请求URL并发送GET请求,解析响应数据。调用时需遵守平台规定,保护用户隐私,确保内容真实性。
|
12天前
|
搜索推荐 数据挖掘 API
淘宝天猫商品评论数据接口丨淘宝 API 实时接口指南
淘宝天猫商品评论数据接口(Taobao.item_review)提供全面的评论信息,包括文字、图片、视频评论、评分、追评等,支持实时更新和高效筛选。用户可基于此接口进行数据分析,支持情感分析、用户画像构建等,同时确保数据使用的合规性和安全性。使用步骤包括注册开发者账号、创建应用获取 API 密钥、发送 API 请求并解析返回数据。适用于电商商家、市场分析人员和消费者。
|
22天前
|
JSON API 开发工具
淘宝实时 API 接口丨淘宝商品详情接口(Taobao.item_get)
淘宝商品详情接口(Taobao.item_get)允许开发者获取商品的详细信息,包括基本信息、描述、卖家资料、图片、属性及销售情况等。开发者需注册账号、创建应用并获取API密钥,通过构建请求获取JSON格式数据,注意遵守平台规则,合理使用接口,确保数据准确性和时效性。