文档章节

基于NIO的消息路由的实现(三)服务端与客户端结构

皮鞋铮亮
 皮鞋铮亮
发布于 2015/08/18 10:01
字数 418
阅读 199
收藏 8

一、服务器端结构:

如图所示:

  • 指令类和报文类:对下行的指令和上行的报文进行了类的封装,分别实现IOrder和IPacket接口,继承Order,Packet基类;

  • 服务主线程:接受客户端连接,将客户端发送的报文投递到通讯队列中,发送指令给客户端;保存连接对象(GVConnection)

  • 通讯队列CQ:存储客户端发送过来的报文,此报文由通讯主线程放入;

  • 通讯队列消费者:对通讯队列中的报文进行处理,该做什么做什么,如果是短消息,则放入消息队列MQ中单独处理;

  • 消息队列消费者:对MQ中的短消息进行处理;如果转发的目标客户端没有通道(channel),那么就存入redis。(此部分目前尚未实现)

  • 通道清理线程,针对超时的通道,已关闭的通道进行定期清理;此部分应该有更好地实现方式,请大家帮忙想想吧。

二、客户端结构:


  • 指令和报文类同上;

  • 链路维护线程:每隔一定的时间发送给服务端K报文,用于链路检测,如果超过服务端的连续回应次数超过一定的限制(比如,连续三次没有回应),那么,视为已经掉线;

  • 短线重连线程:两种情况会引发重连:1、服务端主动切断通道;这来是可捕获的;2、异常中断(依靠链路维护);


© 著作权归作者所有

共有 人打赏支持
皮鞋铮亮
粉丝 36
博文 12
码字总数 11603
作品 0
沈阳
私信 提问
加载中

评论(3)

宅男小何
宅男小何
客户端做一个ack确认,如果服务器端在一段时间内未收到ack,就重发。
可以设置重发次数,如果重发10次,还没收到ack,那就主动放弃。
当然这种模式可能有重复发,但是可以最大化保证消息不丢失。
皮鞋铮亮
皮鞋铮亮

引用来自“xtgss007”的评论

如果客户端刚好异常中断,此时,服务端还没有侦测到异常,那么消费者继续消费,此时造就了两个问题:
1、如果继续发送就会产生消息丢失的情况
2、如果保存到介质,在客户端下次连上时再发送,很有可能会重发, 或漏发。因为时间点的问题,不知道客户是什么时候产生异常的。
你说的问题确实存在。 目前我不知道如何捕获客户端异常中断的情况,目前我暂时只能做到这里,不知道有没有更好地方法,请您不吝赐教,万分感激。如果是在业务实现上,针对必要的消息那么应该在收到客户端的回应以后,才能视为消息发送成功。
xtgss007
xtgss007
如果客户端刚好异常中断,此时,服务端还没有侦测到异常,那么消费者继续消费,此时造就了两个问题:
1、如果继续发送就会产生消息丢失的情况
2、如果保存到介质,在客户端下次连上时再发送,很有可能会重发, 或漏发。因为时间点的问题,不知道客户是什么时候产生异常的。
基于NIO的消息路由的实现(一) 前言

一、前言: 已经很久没有碰编码了,大概有9年的时间,日新月异的框架和新东西让我眼花缭乱。之前一直在做web相关的应用。由于项目不大,分布式开发在我编码的那个年代里没有做过,后来走上管...

皮鞋铮亮
2015/08/17
0
16
Android与MINA2、Netty4的跨平台UDP双向通信实战

概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。 当前由于NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。...

JackJiang-
2016/06/30
804
1
如何使用Netty开发实现高性能的RPC服务器

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议。说的再直白一点,就是客户端在不必知道调用细节的...

vshcxl
2017/10/20
0
0
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了。同时...

JackJiang-
2016/06/28
627
0
基于netty实现的服务端Nio MVC业务开发--ketty

Ketty 基于 netty 实现的服务端 Nio MVC 业务开发平台,提供性能监控,日志分析,动态扩展的功能。 ketty-srv模块 基于netty实现支持自定义协议扩展的Nio MVC高性能业务框架 协议 Http Ketty...

郑大侠
2015/11/09
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Java中前台接收后台List数据并循环打印

在Java后端获取到了数据,然后我们需要传到前端页面展现出来。 方法有两种: 方法一: 后端: request.setAttribute("list",list); 前端: <%ArrayList list = (ArrayList) request.get...

小_橙_子
14分钟前
0
0
Java:字节流和字符流(输入流和输出流)

什么是流 如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互...

编程SHA
14分钟前
0
0
zookeeper收尾+dubbo前瞻

zookeeper是一个开源的分布式协调框架:数据发布订阅,负载均衡,集群,master选举。 原子性:要么同时成功,要么同是失败(分布式事务) 单一视图:无论客户端连接到哪个服务器,所看到的模...

微笑向暖wx
15分钟前
0
0
oracle11g 修改字符集 修改为ZHS16GBK

oracle11g 修改字符集 修改为ZHS16GBK 1.cmd下,cd到oracle数据库软件的服务器端 如:D:\app\Administrator\product\11.2.0\dbhome_1\BIN 2.输入set ORACLE_SID=你想进入的数据库的那个sid 3...

xiaoxin
15分钟前
0
0
图片缓存

Kxvz
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部