ngl_server 1.0
基于 Actor 模型的 C++ 服务器框架
ngl::actor Class Reference

带消息队列、优先级调度和广播支持的Actor实现。 More...

#include <actor.h>

Inheritance diagram for ngl::actor:
ngl::actor_base ngl::actor_events< ENUM_EVENTS_LOGIC, eevents_logic, eevents_logic_count > ngl::actor_events< ENUM_EVENTS_MAP, eevents_map, eevents_map_count > ngl::actor_example< actor_example_guess_number > ngl::actor_activity_manage ngl::actor_brief ngl::actor_chat ngl::actor_client ngl::actor_create ngl::actor_csvclient ngl::actor_csvserver ngl::actor_db< TDBTAB_TYPE, TDBTAB > ngl::actor_demo01 ngl::actor_demo01_manager ngl::actor_demo03 ngl::actor_demo03_manager ngl::actor_events< ETYPE, E_EVENTS, E_EVENTS_COUNT > ngl::actor_example< TACTOR > ngl::actor_example_manage ngl::actor_example_match ngl::actor_family ngl::actor_friends ngl::actor_gateway ngl::actor_gateway_c2g ngl::actor_gateway_g2c ngl::actor_gm ngl::actor_gmclient ngl::actor_kcp ngl::actor_keyvalue ngl::actor_log ngl::actor_login ngl::actor_mail ngl::actor_notice ngl::actor_ranklist ngl::actor_robot ngl::actor_robot_manage ngl::actor_role ngl::actor_role_manage ngl::actor_server ngl::actor_testai ngl::actor_testlua ngl::actor_testlua2

Public Member Functions

template<typename TDerived>
void init_rfun ()
 初始化消息分发器。
 actor (const actorparm &aparm)
 构造函数。
actor_stat activity_stat () final
 获取调度器可见的生命周期状态。
void set_activity_stat (actor_stat astat) final
 更新调度器可见的生命周期状态。
void release () final
 停止actor,排空队列中的工作,并持久化DB支持的状态。
bool list_empty () final
 检查普通队列和优先级队列是否都为空。
bool pending_empty () final
 检查高优先级队列是否为空
bool high_empty () final
 检查优先级队列是否为空。
std::optional< int32_t > hight_value ()
 获取当前最高优先级值。
bool push (handle_pram &apram) final
 将传入任务入队到相应的优先级队列。
bool actor_handle (i32_threadid athreadid) final
 在指定的工作线程上运行一个调度切片。
template<typename T>
bool ahandle (const std::shared_ptr< T > &aparm)
 处理类型化消息。
bool ahandle (i32_threadid athreadid, handle_pram &aparm)
 处理消息队列中的消息。
virtual void broadcast ()
 广播消息处理钩子。
bool handle_broadcast (const message< np_actor_broadcast > &adata)
 合成广播消息的内部入口点。
bool handle_close (const message< np_actor_close > &)
 合成关闭消息的内部入口点。
template<typename TMESSAGE>
bool handle_script (const message< TMESSAGE > &adata)
 将类型化消息转发到附加的脚本运行时。
Public Member Functions inherited from ngl::actor_base
 actor_base (const actorparmbase &aparm)
 Actor基类构造函数
nreadyready ()
std::unique_ptr< nmanage_dbclient > & manage_dbclient ()
void set_db_component (ndb_component *acomponent)
void db_component_init_data ()
void init_db_component (bool acreate)
void add_dbclient (ndbclient_base *adbclient, i64_actorid aid)
template<pbdb::ENUM_DB DBTYPE, typename TDBTAB, typename TACTOR>
bool handle_db (const message< np_actordb_load_response< DBTYPE, TDBTAB > > &adata)
virtual void init ()
virtual void handle_after (handle_pram &)
virtual void loaddb_finish (pbdb::ENUM_DB atype, enum_dbstat astat)
virtual void erase_actor_before ()
virtual void save ()
bool is_single () const
const nguidguid () const
i64_actorid id_guid () const
i32_actordataid id () const
i16_area area () const
ENUM_ACTOR type () const
virtual void erase_actor ()
 从actor_manage中注销并销毁此Actor
bool nscript_using () const
bool nscript_db_loadfinish () const
template<typename T>
bool nscript_data_push (const char *asource, const T &adata, bool aedit)
template<typename T>
bool nscript_data_del (int64_t adataid)
template<typename T>
bool nscript_data_checkout (int64_t adataid, T &adata)
template<typename T>
bool nscript_data_checkout (std::map< int64_t, T > &adata)
template<typename T>
bool nscript_data_checkdel (int64_t adataid)
template<typename T>
bool nscript_data_checkdel (std::vector< int64_t > &adeldata)
template<typename T>
bool nscript_handle (const T &adata)
void kcp_setindex (i32_serverid aserverid, pbnet::ENUM_KCP aenum, i16_port akcpindex)
std::optional< i16_portkcp_index (i32_serverid aserverid, pbnet::ENUM_KCP aenum)
std::optional< i16_portkcp_index (int16_t aservertid, int16_t atcount, pbnet::ENUM_KCP aenum)
bool kcp_connect (i16_port auport, const std::string &aip, i16_port aprot, i64_actorid aactoridserver, std::string &akcpsession) const
int64_t set_timer (const np_timerparm &aparm)
 为当前Actor设置定时器
bool isbroadcast () const
void set_broadcast (bool aisbroadcast)
template<typename T>
void handle_print (const message< T > &adata) const

Static Public Member Functions

template<typename TDerived>
static void register_timer (Tfun< TDerived, np_timerparm > afun=&TDerived::timer_handle)
 注册定时器回调函数。
template<typename TDerived, typename T>
static void register_actor_s (const std::function< void(TDerived *, const message< T > &)> &afun)
 注册基于std::function的消息处理器。
template<typename TDerived, typename ... ARG>
static void register_actor (ARG... afun)
 注册一个或多个强类型消息处理器。
template<typename TDerived, typename T>
static void register_actornonet (const Tfun< TDerived, T > afun)
 注册本地专用消息处理器(不来自网络协议分发)。
template<typename TDerived, typename ... ARG>
static void register_handle ()
 注册TDerived::handle作为消息处理器。
template<typename TDerived, typename ... ARG>
static void register_script_handle ()
 注册脚本支持的消息处理器。
template<typename TDerived, typename ... ARG>
static void register_forward_c2g ()
 注册客户端到网关的转发处理器。
template<typename TDerived, typename ... ARG>
static void register_forward_g2c ()
 注册网关到客户端的转发处理器。
template<typename TDerived, ENUM_ACTOR ACTOR, typename ... ARG>
static void register_secondary_forward_c2g ()
 注册中继actor的二级转发辅助器。
Static Public Member Functions inherited from ngl::actor_base
static void erase_actor (const nguid &aguid)
static std::shared_ptr< packjsonpack (const std::string &apbname, const std::string &ajson, i64_actorid aactorid, i64_actorid arequestactorid, bool ahead=false)
template<typename T>
static std::shared_ptr< packnet_pack (T &adata, i64_actorid aactorid, i64_actorid arequestactorid, bool ahead=false)
static bool send_pack (i32_sessionid asession, std::shared_ptr< pack > &apack)
template<typename T>
static bool send (i32_sessionid asession, const T &adata, i64_actorid aactorid, i64_actorid arequestactorid)
template<typename T>
static bool send_server (i32_serverid aserverid, const T &adata, i64_actorid aactorid, i64_actorid arequestactorid)
template<typename T>
static bool send_server (const std::set< i32_serverid > &aserverids, const T &adata, i64_actorid aactorid, i64_actorid arequestactorid)
static bool send_server (i32_serverid aserverid, std::shared_ptr< pack > &apack)
static bool kcp_sendpack (i64_actorid aactorid, std::shared_ptr< pack > &adata, i16_port auport=0)
static bool kcp_sendpack (const std::set< i64_actorid > &aactorids, std::shared_ptr< pack > &adata, i16_port auport=0)
template<typename T>
static bool kcp_send (i64_actorid aactorid, const T &adata, i16_port auport=0)
 向单个Actor发送KCP数据(actor_base模板实现)。
template<typename T>
static bool kcp_send (const std::set< i64_actorid > &aactorids, const T &adata, i16_port auport=0)
 向一组Actor广播KCP数据(actor_base模板实现)。
static i64_actorid actorclient_guid ()
template<typename T>
static void send_client (const std::set< i64_actorid > &aids, const T &adata, ENET_PROTOCOL aprotocol=ENET_TCP)
template<typename T>
static void send_client (i64_actorid aid, const T &adata, ENET_PROTOCOL aprotocol=ENET_TCP)
template<typename T>
static void send_client (const std::vector< i64_actorid > &aids, const T &adata, ENET_PROTOCOL aprotocol=ENET_TCP)
template<typename T>
static void send_client (const T &adata, ENET_PROTOCOL aprotocol=ENET_TCP)
template<typename T>
static void send_clientbyarea (i16_area aarea, const T &adata, ENET_PROTOCOL aprotocol=ENET_TCP)
static void send_actor (const nguid &aguid, const std::shared_ptr< pack > &adata)
 向指定Actor发送消息包
template<typename T, bool IS_SEND = true>
static void send_actor (ENUM_ACTOR atype, const std::shared_ptr< T > &adata)
template<typename T, bool IS_SEND = true>
static void send_actor (const nguid &aguid, const nguid &arequestguid, const std::shared_ptr< T > &adata)
template<typename T, bool IS_SEND = true>
static void send_actor (const nguid &aguid, const nguid &arequestguid, const std::shared_ptr< T > &adata, const std::function< void()> &afailfun)
template<typename T, bool IS_SEND = true>
static void send_actor (const std::set< i64_actorid > &asetguid, const nguid &arequestguid, const std::shared_ptr< T > &adata)
static void start_broadcast ()
 启动全局广播定时器
template<typename TDerived>
static void first_nregister (ENUM_ACTOR atype)
template<typename TACTOR, typename ... ARG>
static std::shared_ptr< actor_basecreate (i16_area aarea, i32_actordataid aid, ARG &&... args)
 actor工厂方法(编译期类型)
template<typename ... ARG>
static std::map< ENUM_ACTOR, create_fun< ARG... > > & creators ()
template<ENUM_ACTOR EACTOR, typename TACTOR, typename ... ARG>
static void cregister ()
template<typename ... ARG>
static std::shared_ptr< actor_basecreate (ENUM_ACTOR atype, i16_area aarea, i32_actordataid aid, ARG &&... args)
 actor工厂方法(运行时类型,查分桶表转调编译期create<TACTOR>)

Additional Inherited Members

Public Types inherited from ngl::actor_base
template<typename ... ARG>
using create_fun = std::function<std::shared_ptr<actor_base>(i16_area, i32_actordataid, ARG...)>

Detailed Description

带消息队列、优先级调度和广播支持的Actor实现。

该类继承自actor_base,提供了完整的消息队列管理和调度功能。 主要特性包括:

  • 双优先级消息队列(普通和高优先级)
  • 基于权重和时间的调度策略
  • 队列溢出告警和限频机制
  • 广播消息支持
  • 脚本运行时集成
  • 类型安全的消息分发

使用示例:

class MyActor : public actor {
public:
MyActor(const actorparm& parm) : actor(parm) {
}
void handle(const message<SomeMessage>& msg) {
// 处理消息
}
};

Constructor & Destructor Documentation

◆ actor()

ngl::actor::actor ( const actorparm & aparm)
explicit

构造函数。

actor构造函数

Parameters
aparmactor初始化参数

初始化actor实例,设置消息处理权重和超时时间。验证参数有效性, 确保DB支持的actor包含在广播tick中以便维护阶段刷新待处理的变更。

Parameters
[in]aparmactor参数配置,包含权重、超时、告警阈值等设置
Exceptions
调用tools::no_core_dump()终止程序如果参数无效
Note
DB支持的actor必须包含在广播tick中

Member Function Documentation

◆ activity_stat()

actor_stat ngl::actor::activity_stat ( )
finalvirtual

获取调度器可见的生命周期状态。

获取actor活动状态

Returns
actor_stat 当前状态

获取当前actor的活动状态,用于监控和调度决策。

Returns
当前actor活动状态枚举值
Note
读取锁保护,线程安全

Implements ngl::actor_base.

◆ actor_handle()

bool ngl::actor::actor_handle ( i32_threadid athreadid)
finalvirtual

在指定的工作线程上运行一个调度切片。

actor消息处理主循环

Parameters
athreadid工作线程ID
Returns
bool 是否还有待处理的消息
Note
根据m_weight和m_timeout控制处理量

分两阶段排空消息队列:

  1. 高优先级阶段:交换整个高优先级map到本地副本,分发优先级高于就绪门控的桶, 将未消费的消息返回共享map。
  2. 普通优先级阶段:交换普通队列,在m_timeout时间预算内处理最多m_weight条消息, 将未处理的消息拼接回前端保持FIFO顺序。
    Parameters
    [in]athreadid处理消息的工作线程ID(-1表示释放模式)
    Returns
    true表示有消息被处理,false表示没有可处理的消息
    Note
    交换模式允许处理器自由入队新消息而不争用actor互斥锁

Implements ngl::actor_base.

◆ ahandle() [1/2]

template<typename T>
bool ngl::actor::ahandle ( const std::shared_ptr< T > & aparm)
inline

处理类型化消息。

Template Parameters
T消息类型
Parameters
aparm消息智能指针
Returns
bool 处理是否成功
Note
内部调用消息分发器进行处理

◆ ahandle() [2/2]

bool ngl::actor::ahandle ( i32_threadid athreadid,
handle_pram & aparm )

处理消息队列中的消息。

处理单条消息的分发

Parameters
athreadid工作线程ID
aparm消息参数
Returns
bool 处理是否成功

通过注册的消息分发表将消息路由到对应的处理函数。 如果找不到处理器,通过notfindfun报告未知消息。

Parameters
[in]athreadid处理消息的工作线程ID
[in]aparm消息处理参数
Returns
true表示消息已处理(包括未知消息报告),false表示actor函数表为空

◆ broadcast()

virtual void ngl::actor::broadcast ( )
inlinevirtual

广播消息处理钩子。

Note
在DB状态刷新后从共享的进程级广播事件中调用
派生类可以重写此方法实现自定义广播逻辑

◆ handle_broadcast()

bool ngl::actor::handle_broadcast ( const message< np_actor_broadcast > & adata)

合成广播消息的内部入口点。

处理广播消息

Parameters
adata广播消息
Returns
bool 处理是否成功

先持久化DB支持的状态,然后调用broadcast()虚函数执行广播逻辑。 确保broadcast()可以假设DB支持的状态已同步。

Parameters
[in]adata广播消息数据(未使用)
Returns
始终返回true
Note
先save()后del()确保数据一致性

◆ handle_close()

bool ngl::actor::handle_close ( const message< np_actor_close > & )

合成关闭消息的内部入口点。

处理关闭消息

Parameters
adata关闭消息
Returns
bool 处理是否成功

从actor管理器中注销当前actor,触发资源清理。

Parameters
[in]关闭消息数据(未使用)
Returns
始终返回true

◆ handle_script()

template<typename TMESSAGE>
bool ngl::actor::handle_script ( const message< TMESSAGE > & adata)

将类型化消息转发到附加的脚本运行时。

Template Parameters
TMESSAGE消息类型
Parameters
adata消息
Returns
bool 转发是否成功

◆ high_empty()

bool ngl::actor::high_empty ( )
finalvirtual

检查优先级队列是否为空。

Returns
bool 是否为空

Implements ngl::actor_base.

◆ hight_value()

std::optional< int32_t > ngl::actor::hight_value ( )

获取当前最高优先级值。

获取高优先级队列的最高优先级值

Returns
std::optional<int32_t> 最高优先级值,如果队列为空则返回空
Note
**非线程安全**,必须在调用方持有 actor::m_mutex 锁的情况下调用。

返回高优先级队列中当前最高优先级的数值,用于优先级调度决策。

Returns
最高优先级值,如果队列为空返回std::nullopt
Note
非线程安全,需要在锁保护下调用

◆ init_rfun()

template<typename TDerived>
void ngl::actor::init_rfun ( )
inline

初始化消息分发器。

Template Parameters
TDerived派生actor类型
Note
必须在actor构造函数中调用,用于注册消息处理器
如果actor参与广播,会自动注册广播消息处理器
自动注册关闭消息处理器

◆ list_empty()

bool ngl::actor::list_empty ( )
finalvirtual

检查普通队列和优先级队列是否都为空。

检查消息队列是否为空

Returns
bool 是否为空

考虑高优先级队列的就绪状态,判断是否有消息需要处理。 当高优先级队列中存在优先级低于就绪阈值的消息时,认为队列非空。

Returns
true表示队列为空或没有可处理的消息,false表示有消息需要处理
Note
读取锁保护,线程安全

Implements ngl::actor_base.

◆ pending_empty()

bool ngl::actor::pending_empty ( )
finalvirtual

检查高优先级队列是否为空

检查高优先级消息队列是否有待处理的消息。

Returns
true表示高优先级队列为空,false表示有高优先级消息
Note
读取锁保护,线程安全

Implements ngl::actor_base.

◆ push()

bool ngl::actor::push ( handle_pram & apram)
finalvirtual

将传入任务入队到相应的优先级队列。

向actor消息队列推送消息

Parameters
apram任务参数
Returns
bool 入队是否成功

根据协议定义的优先级将消息插入高优先级或普通优先级队列。 高优先级消息按优先级数值分桶存储,普通消息追加到FIFO尾部。 当队列深度超过告警阈值时发送日志告警和邮件通知。

Parameters
[in]apram消息处理参数,包含协议类型、请求actor等信息
Returns
true表示推送后actor处于可调度状态
Note
日志和邮件在锁外完成,避免阻塞其他生产者

Implements ngl::actor_base.

◆ register_actor()

template<typename TDerived, typename ... ARG>
void ngl::actor::register_actor ( ARG... afun)
inlinestatic

注册一个或多个强类型消息处理器。

Template Parameters
TDerived派生actor类型
ARG消息处理函数类型包
Parameters
afun消息处理函数

◆ register_actor_s()

template<typename TDerived, typename T>
void ngl::actor::register_actor_s ( const std::function< void(TDerived *, const message< T > &)> & afun)
inlinestatic

注册基于std::function的消息处理器。

Template Parameters
TDerived派生actor类型
T消息类型
Parameters
afun消息处理函数

◆ register_actornonet()

template<typename TDerived, typename T>
void ngl::actor::register_actornonet ( const Tfun< TDerived, T > afun)
inlinestatic

注册本地专用消息处理器(不来自网络协议分发)。

Template Parameters
TDerived派生actor类型
T消息类型
Parameters
afun消息处理函数

◆ register_forward_c2g()

template<typename TDerived, typename ... ARG>
void ngl::actor::register_forward_c2g ( )
inlinestatic

注册客户端到网关的转发处理器。

Template Parameters
TDerived派生actor类型
ARG消息类型包

◆ register_forward_g2c()

template<typename TDerived, typename ... ARG>
void ngl::actor::register_forward_g2c ( )
inlinestatic

注册网关到客户端的转发处理器。

Template Parameters
TDerived派生actor类型
ARG消息类型包

◆ register_handle()

template<typename TDerived, typename ... ARG>
void ngl::actor::register_handle ( )
inlinestatic

注册TDerived::handle作为消息处理器。

Template Parameters
TDerived派生actor类型
ARG消息类型包

◆ register_script_handle()

template<typename TDerived, typename ... ARG>
void ngl::actor::register_script_handle ( )
inlinestatic

注册脚本支持的消息处理器。

Template Parameters
TDerived派生actor类型
ARG消息类型包
Note
将消息转发到actor脚本运行时

◆ register_secondary_forward_c2g()

template<typename TDerived, ENUM_ACTOR ACTOR, typename ... ARG>
void ngl::actor::register_secondary_forward_c2g ( )
inlinestatic

注册中继actor的二级转发辅助器。

Template Parameters
TDerived派生actor类型
ACTOR目标actor类型
ARG消息类型包

◆ register_timer()

template<typename TDerived>
void ngl::actor::register_timer ( Tfun< TDerived, np_timerparm > afun = &TDerived::timer_handle)
inlinestatic

注册定时器回调函数。

Template Parameters
TDerived派生actor类型
Parameters
afun定时器回调函数(默认使用TDerived::timer_handle)

◆ release()

void ngl::actor::release ( )
finalvirtual

停止actor,排空队列中的工作,并持久化DB支持的状态。

释放actor资源

Note
此方法会等待所有消息处理完成

在清除容器之前同步排空剩余队列,确保关闭过程遵循与正常调度相同的排序规则。 重置告警状态,使回收的actor不会携带过期计数器。

Note
释放过程包含三个阶段:设置释放标志、排空队列、清理容器

Implements ngl::actor_base.

◆ set_activity_stat()

void ngl::actor::set_activity_stat ( actor_stat astat)
finalvirtual

更新调度器可见的生命周期状态。

设置actor活动状态

Parameters
astat新状态

设置actor的活动状态,影响调度器对actor的处理策略。

Parameters
[in]astat要设置的活动状态
Note
写入锁保护,线程安全

Implements ngl::actor_base.


The documentation for this class was generated from the following files: