逐步实现TCP服务端Step05-1:实现Proxy

Proxy的基本功能是将收到的消息原封不动地转发给单个或多个目标实体。可用“类型+ID”的方式来标识一个实体。这样,源实体只要提供目标实体的类型、ID以及转发方式,Proxy就可完成转发工作。

转发方式可细分为如下几种:

  • 一对一(P2P):一个源实体对应一个目标实体。此种情况,源实体需要提供目标实体的实体类型和实体ID。

  • 一对多(P2G):一个源实体对应一组(Group)目标实体。这种情况与上面的P2P方式类似,只是给出了不止一个目标实体。

  • 一对多(Broadcast):P2G是“组播”,这个是“广播”,它会将消息转发给指定类型的全部实体。此种情况,源实体只要给出目标实体的类型即可。

  • 一对一(基于负载均衡规则):原始的P2P方式是直接根据给定的目标实体的类型和ID检索到目标实体,实施转发。可以在P2P的基础上,使用某种负载均衡规则,把消息分布到某个实体上,最简单的规则是取模。此种情况,源实体需要给出目标实体的类型和一个key值,proxy会用该key值去模目标实体的总数目,得到的结果用于检索最终要转发的目标实体。下图中,假设key的值为1234,从上到下,三个ET_ASVRD类型的实体,其索引依次为0,1,2 。

实现方案

首先,要定义一个Proxy消息首部,该首部附加于待转发消息之前。主要用于指定与转发相关的信息,如:目标实体的类型,实体ID和转发类型。这个转发信息可用一个联合体来描述。

1
2
3
4
5
6
7
8
union TransferInfo {
    unsigned int key;
    int dst_id;
    struct Group {
        short entity_num;
        int entities[MAX_SVRD_NUM];
    } group;
};

对于Proxy,应使用多线程模型,主线程不做实际的“工作”,只负责监听外部连接。 每一“类”实体对应一个工作线程,工作线程会循环检测(使用select之类的机制)该类型的所有实体是否有消息到来,有的话,就根据Proxy消息首部中提供的信息,检索到目标实体(socket),然后将消息发出去。

具体实现见antframe中的Proxy工程,antframeimp_tcp_server演变而来,二者的基本设定都是一致的,只是antframe功能更完善了,更接近实用。以后涉及到具体实现的地方,除非特殊说明,均以antframe为基准,原imp_tcp_server中的s对应于antframe中的mainsvrd 。


<==  index  ==>