源战役
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
6.4 KiB

  1. %%% -------------------------------------------------------
  2. %%% @author huangyongxing@yeah.net
  3. %%% @doc
  4. %%% @end
  5. %%% -------------------------------------------------------
  6. -ifndef(CROSS_ZONE_HRL).
  7. -define(CROSS_ZONE_HRL, ok).
  8. %% 保存跨服小分区进程信息的ETS表
  9. -define(CROSS_ZONE_WORKER, cross_zone_worker).
  10. %% 未定义delay_time时,默认的延迟分区时间(毫秒)
  11. -ifdef(DEV_SERVER).
  12. -define(DELAY_DEFAULT, 35000).
  13. -else.
  14. -define(DELAY_DEFAULT, 600000).
  15. -endif.
  16. %% 进程状态标记
  17. -define(STATE_WAITING, 0). % 延迟等待状态,暂不接收新节点加入
  18. -define(STATE_RUNNING, 1). % 分区运转状态,可加入新节点
  19. %% 进程初始化返回值(也可以作为初始传入参数)
  20. %% (用于约束init回调时返回的结果,未设置的字段使用此处的默认值)
  21. %% 部分字段补充说明:
  22. %% zone_type
  23. %% open_time 按开服时间(公共)
  24. %% ... 其他公共的规则(后面视需要补充)
  25. %% czone czone模块方式,唯一,有比较独立的分区维护规则(2个同阶子分区合并扩展)
  26. %% Other 回调模块自定义
  27. %%
  28. %% 关于分区类型为czone的特别说明:
  29. %% czone模块定义的是标准分区模式,跨服中只有一个该类分区。
  30. %% 大部分功能基于该分区进行数据维护。
  31. %% 此类型下,只有module_state与init_zones有效,
  32. %% later_join自动设置为true(用于获知节点连接通知),
  33. %% 其他参数在主程序中将忽略,没有实际意义
  34. %% filter
  35. %% 检查过滤节点的接口,真实参数会加上节点信息:[#game_node{} | Args]
  36. %% filter定义的接口,调用后返回true表示节点参与跨服小分区,否则不参与
  37. %% 如果filter值为undefined,则表示不检查,相当于所有服都参与跨服小分区
  38. -record(zone_init_ret, {
  39. %% 分区方式
  40. zone_type = open_time :: term()
  41. %% 跨服小分区中游戏服数量,在模块中进行了范围限制
  42. ,num_per_zone = 4 :: non_neg_integer()
  43. %% 默认的延迟分区时间(如定义了值为false则表示不自动分区,如果init_zones设置了分区,则不生效)
  44. ,delay_time = ?DELAY_DEFAULT :: non_neg_integer() | false
  45. %% 后面连接到跨服中心的游戏服是否自动加入到后面分区
  46. ,later_join = true :: boolean()
  47. %% 检查节点是否参与跨服小分区(可自定义筛选条件,与join_day共同作用)
  48. ,filter = undefined :: {Mod :: atom(), Fun :: atom(), Args :: list()} | undefined
  49. %% 允许加入跨服小分区的开服天数
  50. ,join_day = 0 :: non_neg_integer()
  51. %% 回调模块数据,结构由业务实现模块自定义
  52. ,module_state = undefined :: term() | undefined
  53. %% init_zones初始分区结果(适用于需要保存分区,启动时加载的情况,模板不负责数据保存与加载工作)
  54. %% 结果为undefined表示未进行分区
  55. %% 结果为[ZoneInfo :: #zone_info{}],表示初始已有分区结果(不自动分区,此时delay_time不生效)
  56. ,init_zones = undefined :: list() | undefined
  57. %% 在特殊分区管理逻辑中,用于存储自定义的分区运算逻辑相关核心数据
  58. ,zone_sys = undefined :: any() | undefined
  59. }).
  60. %% 进程栈State与回调模块交换数据时的中间参数
  61. %%
  62. %% 跨服小分区模块回调handle_event/3接口时传递的参数
  63. %% 以下两个接口,也会给回调函数增加一个#zone_state{}数据作为首个参数
  64. %% cross_zone:apply_cast_with_data/2
  65. %% cross_zone:apply_call_with_data/2
  66. -record(zone_state, {
  67. max_zone_id = 0 % 当前最大的分区编号,业务模块只读
  68. ,svr_zone_map = #{} % 分区的ServerId与ZoneId映射关系,业务模块只读
  69. ,zone_sys = undefined % 在特殊分区管理逻辑中,用于存储自定义的分区运算逻辑相关核心数据
  70. ,module_state = undefined % 用于记录用户模块自定义的数据,一般功能系统通常只更改此数据进行返回
  71. }).
  72. %% -------------------------------------------------------
  73. %% 进程字典中存储分区相关核心数据
  74. %% 不要在以下结构中添加额外字段
  75. %%
  76. %% 为保证接口清晰和便于维护,
  77. %% 以下数据结构中,通常只存储与分区管理逻辑相关核心数据,
  78. %%
  79. %% 业务相关数据通常可存储于:
  80. %% 进程状态数据: #zone_proc_state.module_state
  81. %% 进程字典: #zone_info.zone_data + #zone_svr.svr_data
  82. %% 进程字典: 自行维护的数据结构
  83. %%
  84. %% #zone_info.zone_ext 、 #zone_svr.svr_ext 用于存储特殊
  85. %% 分区管理相关的扩展数据
  86. %% -------------------------------------------------------
  87. %% 跨服分区数据
  88. -record(zone_info, {
  89. zone_id = 0 % 分区编号
  90. ,servers = [] % 包含的服务器信息 [ #zone_svr{} ]
  91. ,zone_ext = undefined % 分区管理扩展信息,由特殊分区方法模块自定义
  92. ,zone_data = undefined % 功能模块相关数据
  93. }).
  94. %% 跨服分区中单节点数据
  95. %% PS:
  96. %% 为保证接口清晰和便于维护,这里通常只存储与分区管理逻辑相关核心数据,
  97. %% 各功能业务数据请自行存储,不要添加在此,通常可存储于module_state
  98. -record(zone_svr, {
  99. server_id = 0 % 游戏服server_id
  100. ,server_num = 0 % 游戏服server_num
  101. ,node = undefined % 节点信息
  102. ,conn = true % 节点连接状态
  103. ,svr_ext = undefined % 分区管理扩展信息,由特殊分区方法模块自定义
  104. ,svr_data = undefined % 功能模块相关数据
  105. }).
  106. %% 跨服小分区进程信息(ETS表中数据结构)
  107. %% (主要用于回调检测,不要添加非必要的字段)
  108. -record(cross_zone_worker, {
  109. pid = undefined % 分区管理进程pid
  110. ,name = undefined % 进程注册名称
  111. ,later_join = true % 是否需要通知回调
  112. ,proc_state = ?STATE_RUNNING % 进程状态标记
  113. }).
  114. -endif.