%%% ------------------------------------------------------- %%% @author huangyongxing@yeah.net %%% @doc %%% @end %%% ------------------------------------------------------- -ifndef(CROSS_ZONE_HRL). -define(CROSS_ZONE_HRL, ok). %% 保存跨服小分区进程信息的ETS表 -define(CROSS_ZONE_WORKER, cross_zone_worker). %% 未定义delay_time时,默认的延迟分区时间(毫秒) -ifdef(DEV_SERVER). -define(DELAY_DEFAULT, 35000). -else. -define(DELAY_DEFAULT, 600000). -endif. %% 进程状态标记 -define(STATE_WAITING, 0). % 延迟等待状态,暂不接收新节点加入 -define(STATE_RUNNING, 1). % 分区运转状态,可加入新节点 %% 进程初始化返回值(也可以作为初始传入参数) %% (用于约束init回调时返回的结果,未设置的字段使用此处的默认值) %% 部分字段补充说明: %% zone_type %% open_time 按开服时间(公共) %% ... 其他公共的规则(后面视需要补充) %% czone czone模块方式,唯一,有比较独立的分区维护规则(2个同阶子分区合并扩展) %% Other 回调模块自定义 %% %% 关于分区类型为czone的特别说明: %% czone模块定义的是标准分区模式,跨服中只有一个该类分区。 %% 大部分功能基于该分区进行数据维护。 %% 此类型下,只有module_state与init_zones有效, %% later_join自动设置为true(用于获知节点连接通知), %% 其他参数在主程序中将忽略,没有实际意义 %% filter %% 检查过滤节点的接口,真实参数会加上节点信息:[#game_node{} | Args] %% filter定义的接口,调用后返回true表示节点参与跨服小分区,否则不参与 %% 如果filter值为undefined,则表示不检查,相当于所有服都参与跨服小分区 -record(zone_init_ret, { %% 分区方式 zone_type = open_time :: term() %% 跨服小分区中游戏服数量,在模块中进行了范围限制 ,num_per_zone = 4 :: non_neg_integer() %% 默认的延迟分区时间(如定义了值为false则表示不自动分区,如果init_zones设置了分区,则不生效) ,delay_time = ?DELAY_DEFAULT :: non_neg_integer() | false %% 后面连接到跨服中心的游戏服是否自动加入到后面分区 ,later_join = true :: boolean() %% 检查节点是否参与跨服小分区(可自定义筛选条件,与join_day共同作用) ,filter = undefined :: {Mod :: atom(), Fun :: atom(), Args :: list()} | undefined %% 允许加入跨服小分区的开服天数 ,join_day = 0 :: non_neg_integer() %% 回调模块数据,结构由业务实现模块自定义 ,module_state = undefined :: term() | undefined %% init_zones初始分区结果(适用于需要保存分区,启动时加载的情况,模板不负责数据保存与加载工作) %% 结果为undefined表示未进行分区 %% 结果为[ZoneInfo :: #zone_info{}],表示初始已有分区结果(不自动分区,此时delay_time不生效) ,init_zones = undefined :: list() | undefined %% 在特殊分区管理逻辑中,用于存储自定义的分区运算逻辑相关核心数据 ,zone_sys = undefined :: any() | undefined }). %% 进程栈State与回调模块交换数据时的中间参数 %% %% 跨服小分区模块回调handle_event/3接口时传递的参数 %% 以下两个接口,也会给回调函数增加一个#zone_state{}数据作为首个参数 %% cross_zone:apply_cast_with_data/2 %% cross_zone:apply_call_with_data/2 -record(zone_state, { max_zone_id = 0 % 当前最大的分区编号,业务模块只读 ,svr_zone_map = #{} % 分区的ServerId与ZoneId映射关系,业务模块只读 ,zone_sys = undefined % 在特殊分区管理逻辑中,用于存储自定义的分区运算逻辑相关核心数据 ,module_state = undefined % 用于记录用户模块自定义的数据,一般功能系统通常只更改此数据进行返回 }). %% ------------------------------------------------------- %% 进程字典中存储分区相关核心数据 %% 不要在以下结构中添加额外字段 %% %% 为保证接口清晰和便于维护, %% 以下数据结构中,通常只存储与分区管理逻辑相关核心数据, %% %% 业务相关数据通常可存储于: %% 进程状态数据: #zone_proc_state.module_state %% 进程字典: #zone_info.zone_data + #zone_svr.svr_data %% 进程字典: 自行维护的数据结构 %% %% #zone_info.zone_ext 、 #zone_svr.svr_ext 用于存储特殊 %% 分区管理相关的扩展数据 %% ------------------------------------------------------- %% 跨服分区数据 -record(zone_info, { zone_id = 0 % 分区编号 ,servers = [] % 包含的服务器信息 [ #zone_svr{} ] ,zone_ext = undefined % 分区管理扩展信息,由特殊分区方法模块自定义 ,zone_data = undefined % 功能模块相关数据 }). %% 跨服分区中单节点数据 %% PS: %% 为保证接口清晰和便于维护,这里通常只存储与分区管理逻辑相关核心数据, %% 各功能业务数据请自行存储,不要添加在此,通常可存储于module_state -record(zone_svr, { server_id = 0 % 游戏服server_id ,server_num = 0 % 游戏服server_num ,node = undefined % 节点信息 ,conn = true % 节点连接状态 ,svr_ext = undefined % 分区管理扩展信息,由特殊分区方法模块自定义 ,svr_data = undefined % 功能模块相关数据 }). %% 跨服小分区进程信息(ETS表中数据结构) %% (主要用于回调检测,不要添加非必要的字段) -record(cross_zone_worker, { pid = undefined % 分区管理进程pid ,name = undefined % 进程注册名称 ,later_join = true % 是否需要通知回调 ,proc_state = ?STATE_RUNNING % 进程状态标记 }). -endif.