online游戏服务器架构--业务处理架构

简介:

除了网络架构,业务逻辑的处理更加复杂,为了保证实时性,在处理业务逻辑的时候尽量少用搜索技术,而应该用空间换时间,静态数组是不错的选择,业务逻辑的处理架构其实就是消息映射服务器,通过POST_MSG注册一个回调函数,这个回调函数就是处理具体的业务逻辑的,业务逻辑由协议实现,就是两端商量好的约定俗成的东西:

#define POST_MSG(n,h) if (dispatch[n]) { return -1; } else dispatch[n] = (dispatcher_t)h

Shm_push将业务数据从父进程压入对应子进程的共享内存当中,父进程对数据一无所知,然后子进程从shm_pop开始处理历程,其实就是在net_loop中的handle_recv_queue中调用的shm_pop,这是个循环处理的过程。一个switch开关将pop出来的数据进程分类,大致上分成了关闭包,数据包等等,如果是数据包的话就要进入handle_process的流程:

int handle_process(uint8_t* recvbuf, int rcvlen, int fd, int is_conn)

{

int err = 0;

sprite_t* p;

if (is_conn) {

fdsession_t* fdsess = get_fdsess(fd);

if (fdsess) {

fdsess->last_tm = now.tv_sec;

if ( (err = parse_protocol(recvbuf, rcvlen, fdsess)) )

shm_ctl_block_push(&(config_cache.bc_elem->sendq), fd, FIN_BLOCK, 1);

}

} else { //如果是子进程的话,由于它要和数据库代理服务器进行交互,所以也要处理网络连接

if ( (err = worker_handle_net(fd, recvbuf, rcvlen, &p)) && p )

del_sprite_conn(p, 1);

}

return 0;

}

parse_protocol是核心的调用,在经过一些错误判断和处理后直接将处理流路由到dispatch_protocol函数,在说这个函数之前,有一点要注意,在parse_protocol中会从数据头得到一个session,从这个session中可以得到用户的ID,由于所有的登录用户都会由一个叫做sprite_t的解构体表征,而且只要登录后没有退出的时间段里,这个结构体一直都在,系统会将这些结构体放到一个hash中,这个hash的索引其实就是父进程接收的客户端连接的套接字描述符,由于所有的套接字描述符都在父进程处理,因此它们都是唯一的。等到parse_protocol中调用get_sprite_by_fd将之取出,由于是一个:

sprite_t* get_sprite_by_fd(int fd)

{

sprite_t* p = g_hash_table_lookup(all_sprites, &fd);

if ( !p || IS_NPC_ID(p->id) ) {

return 0;

}

return p;

}

如果说hash是通过fd来唯一索引的原因是因为父进程中套接字连接描述符的唯一性,那么子进程本身也要处理网络连接,比如和数据库代理服务器以及心跳服务器的连接,并且子进程的网络业务处理逻辑和父进程放入共享内存的数据的处理逻辑使用一套框架,如果这些网络连接描述符也加入到hash的话,势必会引起冲突,毕竟父子进程的描述符不必唯一。解决办法就是将请求发往数据库代理服务器的时候连同这个请求的发起者的客户端实体也一并发过去,这样在数据库代理的应答包当中就可以方便的取出原来的客户端实体,这里是用客户端的套结字描述符来作为客户实体标示的,在数据库的应答包当中可以取出来这个描述符fd,然后同样调用get_sprite_by_fd就可以取出关于这个请求的客户端的sprite_t。

总的来说,dispatch_protocol之前的处理逻辑都是和业务协议无关的,仅仅是数据本身以及用户会话实体方面的处理,接下来就是dispatch_protocol了,这个函数里面就开始了特定用户实体的业务协议相关的处理流程了,这个函数最终调用err = dispatch[cmd](p, body, len);,看看dispatch数组:

dispatcher_t dispatch[MAX_PROC_MSG_NUM];

刚才说到的POST_MSG宏的含义就是注册这些回调函数,这个dispatch_protocol函数可以解析数据包的协议类型,然后将请求路由到正确的处理函数中,以一个例子说明,比如一个报名协议的处理函数是race_sign_cmd:

int race_sign_cmd(sprite_t* p, const uint8_t* body, int bodylen)

{

return send_request_to_db(SVR_PROTO_RACE_SIGN, p, 0, NULL, p->id);

}

这个协议没有数据体,仅仅是一个头部,由于在online端无法处理这个和数据相关的请求,下一步就需要将请求进一步转发给数据库代理服务器,也就是send_request_to_db调用。以下就是数据层的处理了,如果online子进程可以处理客户端的清求,那么就会直接返回处理结果,这样就不需要进入数据层了,处理逻辑会朝着刚才说的相反的方向返回,如果进入数据层的话,就有点复杂了。



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274106


相关文章
|
1月前
|
运维 监控 负载均衡
深入理解无服务器架构:优势与挑战
【10月更文挑战第6天】深入理解无服务器架构:优势与挑战
|
23天前
|
监控 网络协议 安全
DNS服务器故障不容小觑,从应急视角谈DNS架构
DNS服务器故障不容小觑,从应急视角谈DNS架构
45 4
|
23天前
|
机器学习/深度学习 监控 Serverless
无服务器架构(Serverless)
无服务器架构(Serverless)
|
29天前
|
存储 固态存储 安全
阿里云服务器X86计算架构解析与X86计算架构云服务器收费价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中X86计算是用户选择最多的一种架构,本文将深入探讨阿里云X86计算架构的云服务器,包括其技术特性、适用场景、性能优势以及最新价格情况。
|
30天前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
1月前
|
监控 Serverless 云计算
探索Serverless架构:无服务器计算的新纪元
Serverless架构作为云计算的新范式,让开发者无需管理服务器即可构建和运行应用,从而专注于代码开发。其核心优势包括成本效益、自动扩展及高效部署。通过事件驱动模型和微服务部署,开发者按需付费,减少了资源浪费。尽管面临冷启动、状态管理和调试等挑战,Serverless架构仍凭借其高效性与可扩展性展现出广阔的应用前景。流行平台如AWS Lambda、Azure Functions等使其实施更为便捷。
|
1月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
47 0
|
5天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
3天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
4天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
14 1
服务架构的演进:从单体到微服务的探索之旅