%%% -------------------------------------------------------
|
|
%%% @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.
|