C++服务器设计(六):设备连接的生命周期管理

生命周期介绍

  每一个服务器系统的新连接从建立开始时,均会经历多个阶段。比如连接的建立,登录的验证,退出前的资源释放等。同时在具体的消息处理中,还会遇到不可识别的消息事件,或者消息处理时出现数据错误等。这些场景在每个连接的整个生命过程都可能会经历,而系统用户也会期望在某些场景中完成特定的操作。比如统计每一个新建连接的信息,对不同类型的客户进行验证过程等。

  在一般的服务器系统中,用户需要主动为每个连接对象维护当前状态,然后在具体业务场景中加入对当前连接状态的判断,并在每一个改变连接状态的场景中执行相关生命周期的操作。这种自身维护连接生命状态的做法,可能会由于未与业务逻辑分离而导致实际业务处理部分代码的混乱,这也增加了用户开发的复杂度,使实际开发工作出错率大大增加。

  而对于每一个不同的消息处理过程中,都有可能在业务逻辑中出现处理出错或不可识别的的数据的情景。这些都需要在每个消息处理的代码中添加大量与实际业务无关的错误处理代码。这同样不利于业务代码的编写,加大了开发者重复的工作量。

  综合以上问题,在服务器系统的设计中我们提出了设备生命周期的概念,并通过系统对连接状态和处理错误的管理,提取出了连接的生命周期和错误处理相关的接口。当用户需要对某个状态的连接客户进行相关操作时,只需重写相关状态的接口函数,同时对于所有错误操作,即可在具体业务逻辑中处理,也可通过在对应接口函数中实现统一的错误处理过程。这大大简化和便利了服务器用户的开发过程。

  同时联系到之前系统对多设备类型的支持,在具体设计中,需要使用的连接生命周期接口在对应的设备类型对象中实现。不同的设备类型中,对于某个生命周期的接口实现不一定相同。同时子类设备类型会继承父类设备类型中实现的接口,同时在子类中还可以对父类实现的接口进行重写。因此我们可以给不同的设备类型制定不同的生命周期接口。

图4-8 连接生命周期

  如图4-8所示显示了一个连接从连接建立到断开的生命周期图,包括临时设备类型的生命周期及登录设备的生命周期。其中标示出了在不同场景中系统提供的相关接口。同时服务器系统保证对于每个连接的生命周期接口的回调都将在分配给该连接对象的单一I/O线程中处理,因此对于单个连接而言无需考虑多线程的问题。

生命周期接口

  以下将对这些接口进行具体介绍:

  • l  onCreate():每当有新连接建立时将会执行该接口回调。因为每个新连接刚建立时均为临时设备类型,因此该接口默认实现在临时设备类型对象中,可以通过对临时设备类型进行重写操作修改该接口的实现。可以在该实现中记录新连接的信息,或者对系统所有新连接信息进行统计。
  • l  onLoginCheckMsg():每当执行登录消息事件时将会执行该接口回调。该接口默认在登录设备类型对象中实现,可以通过新建具体的登录设备类型对该接口进行重写。可以在该接口实现中进行登录检查操作。比如可以通过查询DB等方式检查登录设备账号是否合法,同时可以为该连接分配对应的设备ID。如果登录检查失败,发送失败回复消息并直接返回false即可。如果检查成功,返回true,系统将进一步进行登录操作,若最终登录成功,将回调onLoginSuccessMsg()接口;若系统检查ID失败,则会回调onLoginFailureMsg()接口。
  • l  onLoginSuccessMsg():每当执行登录操作且登录成功后将会执行该接口回调。该接口默认在登录设备类型对象中实现,可以通过新建具体的登录设备类型对该接口进行重写。可以在该接口中实现向客户连接发送登录成功的通知。此时该连接将进入登录设备的生命周期,同时能够请求该设备类型的所有消息事件。
  • l  onLoginFailureMsg():每当连接在onLoginCheckMsg对账号验证成功后,但系统进一步进行登录操作失败后将会执行该接口回调。该接口默认在登录设备类型对象中实现,可以通过新建具体的登录设备类型对该接口进行重写。一般执行该回调表明该连接设置的设备ID与某个以登录的设备ID冲突,表明该账号已登录或给该连接设置的设备ID错误。
  • l  onLogoutMsg():每当登录的连接客户请求注销消息事件时将会执行该接口回调。该接口默认在登录设备类型对象中实现,可以通过新建具体的登录设备类型对该接口进行重写。当该接口被调用时,表明该连接即将被退出登录操作并被断开,并将调用releaseConnNode()接口用于将该连接客户申请的相关资源释放。可以在该接口实现中回复连接客户通知注销操作成功,即将被关闭。
  • l  releaseConnNode():每当登录的连接客户进行注销成功,或者连接由于超时或者其它异常原因被迫退出时,将会执行该接口回调。该接口默认在登录设备类型对象中实现,可以通过新建具体的登录设备类型对该接口进行重写。当该接口被调用时,表明连接对象即将或已经被断开连接,如果之前为该连接申请了一些资源,并仍未释放,需要在此回调中进行释放操作。由于在此处连接可能已经处于断开的状态,因此在此回调中不应该再尝试向连接客户发送消息。
  • l  onOverTime():每当一个连接一段时间内未收到有效消息而超时,将会执行该接口回调。该接口在设备类型对象中实现,在临时设备类型或新建的具体登录设备类型中均可对该接口进行重写。当该接口被调用时,表明该连接对象即将被断开连接。如果是已经登录的连接客户,执行完该调用后将会执行releaseConnNode()进行资源释放。可以在该接口实现中通知连接客户由于连接超时该连接即将被主动断开。
  • l  onErrTypeMessage():每当某个连接接收到一条消息后,如果在该连接对应的设备类型中找不到该消息事件的处理函数,且在临时设备类型中也找不到该消息事件的处理函数,将会执行该接口回调。该接口在设备类型对象中实现,在临时设备类型或新建的具体登录设备类型中均可对该接口进行重写。当该接口被调用,表明该连接收到了一条无法识别或者权限不不够处理的消息事件。可以在该接口实现中通知连接客户该消息事件无法被处理。
  • l  onErrRunMessage():每当某个连接接收到一条消息后,如果在对该消息进行处理时,发生了某些错误,导致解析处理错误,将会执行该接口回调。该接口在设备类型对象中实现,在临时设备类型或新建的具体登录设备类型中均可对该接口进行重写。当该连接被调用,表明消息事件处理出错。可以在该接口实现中通知连接客户该消息事件处理错误。

登录流程分析

  在不同设备连接的生命周期中,服务器系统为所有管理的设备制定了一套统一的登录机制。整个登录流程如图4-9所示。这个机制既保证了对不同设备的统一管理,同时又提供了三个登录相关的接口供具体设备实现,保证不同设备间登录过程中的差异化处理。

图4-9 登录流程分析

  当某个连接用户向服务器请求登录操作时,系统首先检查该连接是否已经登录,如果该连接已经处于登录状态,则直接进入登录成功操作。如果该连接并未登录,系统将根据请求登录消息中传入的类型来为该连接设置设备类型。如果消息中设置的设备类型并不存在,或者并未设置设备类型,系统将默认为该连接设置为登录设备类型(NodeType)。

  然后进行登录账号检查操作。此时将进入该连接的具体设备类型的onLoginCheckMsg()回调中。该接口默认实现是不进行任何检查操作,直接返回为True。我们可以根据不同设备对于登录账号检查的要求的不同,在不同设备类型对象中重写该接口实现。比如根据请求登录消息中传来的账号及密码信息,查询数据库进行校验等。同时也可以在此根据账号密码信息给该连接分配一个登录ID,如果未分配,将采用系统分配的临时ID作为登录ID。如果账号检查失败,则该次登录操作失败,直接返回False,并退出整个登录操作。如果账号检查成功,返回True,但这并不意味着该连接已经登录成功,因为该连接并未真正执行登录操作。

  账号检查成功后,将进入真正的登录操作中,系统将尝试将该连接信息注册到对应设备类型的连接池中,并将该连接从临时设备类型的连接池中删除。但此时依旧可能出现该账号对应ID已经在其他客户端登录或正在登录的错误,导致系统无法完成该连接的登录操作。如果这种情况产生,将回调onLoginFailureMsg()接口。我们可以通过该接口来通知该连接客户此次登录失败及可能的原因。当执行完该接口后将退出整个登录操作。

  如果系统执行登录操作成功后,将会回调执行onLoginSuccessMsg()接口。当该接口被执行时,该次登录操作才算真正的登录成功。因此我们可以通过该接口来通知连接客户此次登录成功的消息。该接口执行完成后,此次登录操作结束。

退出流程分析

  不同于登录过程只存在单一的入口,即通过登录消息事件进行。连接的退出操作存在多种可能。比如对于已经登录的连接用户,最正常的方式是通过logout注销消息事件进行主动退出。但是同样存在其他多种可能:比如远程客户并未发送任何消息突然断开了服务器连接的情景,或者连接客户长期没有发送任何消息导致服务器检测到该连接超时等。我们需要对这些退出操作制定统一的管理,防止异常的退出使服务器系统无法及时释放相关资源,影响系统性能。

图4-10 退出流程分析

  如图4-10所示,如果为连接客户通过logout注销事件请求退出,系统将执行在登录设备类型中注册的该事件的注销处理函数。在注销处理函数中,将会调用该连接实际设备类型的onLogoutMsg接口,通过该接口可以通知连接客户该连接即将被系统关闭。然后将会调用该连接类型的releaseConnNode接口,释放该连接用户申请的相关资源。最后系统将会对该连接执行实际退出操作,强制将该连接从连接池中移除,并且对连接进行关闭。

  如果连接客户并未请求注销事件,而是直接断开了与服务器的连接。此时服务器系统将通过该连接套接字的read系统调用返回为0检测到该连接已经异常退出。由于此时连接已经断开,因此并无再次通知连接客户的必要,因此系统将直接调用该连接类型的releaseConnNode接口,释放该连接用户申请的相关资源。并执行实际退出操作,强制将该连接从连接池中移除,并且对连接进行关闭。

  如果是服务器通过超时机制检测到某个连接超时,系统将对该连接执行超时处理。在超时处理中,系统将通过线程任务队列保证在该连接的线程中执行连接超时处理函数,此时将会调用该连接类型的onOverTime接口,留给用户处理连接超时的场景。然后同样releaseConnNode接口,释放该连接用户申请的相关资源。并执行实际退出操作,强制将该连接从连接池中移除,并且对连接进行关闭。

  以上三种情形中均会调用releaseConnNode接口,因此在该接口的实现中我们应该保证兼容这些情景,只进行连连接用户申请的相关资源的释放工作。其他具体场景相关的处理工作再在其他相关接口中实现。

时间: 2024-10-21 11:11:08

C++服务器设计(六):设备连接的生命周期管理的相关文章

Jasper:用户指南 / 设备 / 生命周期管理 / SIM 卡状态

ylbtech-Jasper:用户指南 / 设备 / 生命周期管理 / SIM 卡状态 1.返回顶部 1. SIM 卡状态 每个设备都有一个状态,决定了它能否在网络上建立数据连接,并且会影响设备是否计费.下图显示了一个典型的设备生命周期.在遵循某些限制的情况下,您可以将设备从一个状态转换到另一个状态. 设备在每个状态下可用的服务由与该设备的通信计划相关联的通信配置文件所控制.Control Center 将"关闭"通信配置文件应用到非活动的设备,而将"开启"通信配置

k8s的Pod状态和生命周期管理

Pod状态和生命周期管理 一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod phase(Pod的相位) (2)Pod的创建过程 (3)Pod的状态 (4)Pod存活性探测 (5)livenessProbe和readinessProbe使用场景 (6)Pod的重启策略 (7)Pod的生命 (8)livenessProbe解析 一.什么是Pod? Pod是kubernetes中你可以

6、Khala的登录生命周期管理

khala能够对设备进行生命周期管理,并提供了与生命周期相关的接口,用户只需在具体的设备类型实现类中重写这些生命周期接口,即可享受khala对于生命周期管理的同时定制与业务相关的操作.具体接口解释如下: onLoginCheckMsg(): 进行登录检查,在此可以通过查询DB等方式检查登录设备账号是否合法,可以为连接设备设置设备ID(此ID必须唯一,将被视为设备key,若出现重复将执行onLoginFailureMsg,若未设置将以临时ID值作为ID key),若账号检查失败,设置失败回复消息并

Tomcat7.0源码分析——生命周期管理

前言 从server.xml文件解析出来的各个对象都是容器,比如:Server.Service.Connector等.这些容器都具有新建.初始化完成.启动.停止.失败.销毁等状态.tomcat的实现提供了对这些容器的生命周期管理,本文将通过对Tomcat7.0的源码阅读,深入剖析这一过程. Tomcat生命周期类接口设计 我们先阅读图1,从中了解Tomcat涉及生命周期管理的主要类. 图1 Tomcat生命周期类接口设计 这里对图1中涉及的主要类作个简单介绍: Lifecycle:定义了容器生命

Elastic 使用索引生命周期管理实现热温冷架构

Elastic: 使用索引生命周期管理实现热温冷架构 索引生命周期管理 (ILM) 是在 Elasticsearch 6.6(公测版)首次引入并在 6.7 版正式推出的一项功能.ILM 是 Elasticsearch 的一部分,主要用来帮助您管理索引. 在本篇博客中,我们将探讨如何使用 ILM 实现热温冷架构.热温冷架构常用于日志或指标类的时序数据.例如,假设正在使用 Elasticsearch 聚合来自多个系统的日志文件.今天的日志正在频繁地被索引,且本周的日志搜索量最大(热).上周的日志可能

tomcat系列分析之生命周期管理初始化动作

tomcat中有很多组件,要对这些组件进行生命周期的管理非常困难,tomcat中采用的是抽象出一个生命周期管理接口,然后所有的组件都实现该接口,当父组件启动时,同事负责将子组件启动起来,从而完成整tomcat的初始.启动.结束等动作. 来看下tomcat启动的过程,首先构造Bootstrap类,调用其中的init方法,完成类加载器的初始化,方便后面加载类使用,然后调用其中的load方法,实际上tomcat真正的启动动作是由Catalina类完成的.而这其中在BootStrap中调用Catalin

Siemens PLM TeamCenter 9.1生命周期管理软件

Siemens PLM TeamCenter 9.1生命周期管理软件Teamcenter 在构建时充分考虑了可扩展性. 无论是需要小规模部署来支持单个站点的小型团队,还是拥有遍布全球的众多站点以及复杂供应链的大型企业,或者介于其间的任何公司,Teamcenter 灵活的体系架构都能满足您当前的业务需求,并能随着贵公司的增长而继续保持出色表现. 下载内容包括: Siemens PLM TeamCenter 9.1 32和64位 为多国语言版本 Disc3 和 Disc4安装包 Teamcenter

Java实现生命周期管理机制

先扯再说 最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪:用完想要关闭它时,拉出它的STOP类想要运行时,发现这个类里赫然只写以下几行代码,于是我感觉瞬间受到了很多伤害. public static void main(String[] args) { System.out.println(new Date() + ",server shutdown!"); } 这个中间件启动和运行的时候,开启了监听,启动着

助力绵阳市商业银行,打造高效项目生命周期管理平台

金融市场捷报连连,近日,TechExcel公司再次凭借产品和服务实力直签下绵阳市商业银行,打造项目全生命周期管理平台.DevSuite研发与项目管理平台为绵阳市商业银行员工提供了一套必不可少的信息化工具,大大提升研发管理效率. 绵阳市商业银行(绵阳市商业银行股份有限公司)是国有控股地方商业银行,成立于2000年9月,是中国(绵阳)科技城唯一一家国有控股法人金融机构.成立至今,绵阳市商业银行秉承"服务地方.服务中小"的企业宗旨,全力打造一流中小企业金融服务机构,不断开创科学发展新局面.2