飞信分布式存储的结构
Site和Pool的概念
Site和物理Pool
Site和物理pool的关系示意图:
概括说来,一个site至少包含一个物理Pool;每个物理Pool包含了多个逻辑pool(功能环境里面,主要集中在物理Pool6和Pool7 分别包含了1万多个和8000多个逻辑pool)
逻辑Pool
每个用户注册的时候,会分配一个逻辑pool,代码段:
foreach (CFG_CarrierMapping mapping in_carrierMappings.Items) {
if(mobileNo.Value >= mapping.MappingStart &&
mobileNo.Value <= mapping.MappingEnd) {
intn = (int)((mobileNo.Value -
mapping.MappingStart) /(long)mapping.LogicalPoolCapacity);
returnn + mapping.LogicalPoolStart;
}
}
1.找到用户手机号码对应的号段
2.(手机号码-起始号段)/logicalPool容量(比如1000) + logicalPool的起始值
Uri
飞信系统中的用户、群等资源以URI标识,客户端一般将URI整体作为字符串处理,且大小写敏感。
格式定义:
sip:SID@Domain;p=logical-pool-id[;t=robot]
用户URI(Id)
飞信用户URI是由几部分组成:
1) 协议头标识“sip:”,注意前后不带空格。
2) SID一般是个十进制的正整数,但应作为字符串来处理。
3) @domain部分为用户所在域,除个别协议中有特别说明外,一般不能省略。
4) 用户URI带有的第一个为p参数,它的值为用户所在的逻辑区域的ID。除个别协议中有特别说明外,一般不能省略。
5) 仅当飞信用户为机器人时,URI中带有第二个参数,即t参数,取值固定为robot。
示例:
sip:50000100@fetion.com.cn;p=3370
示例(机器人):
sip:80000100@fetion.com.cn;p=9990;t=robot
群URI(group)
飞信群URI格式定义与飞信用户相同,但SID组成为“PG”+群号码,如群号码为3000100的群,SID为
:PG3000100 。
示例:
sip:PG3000100@fetion.com.cn;p=1400
服务的URI(srv)
服务名称@domain
ServiceName@fetion.com.cn;
在调用服务的时候,uri就是请求来源,可以通过配置,来定义该服务是否接收这种uri的请求。
相关数据表结构
Site
物理Pool
逻辑Pool
Carrier(运营商)
CarrierMapping
RouteTable
RoutePolicy
HashCluster
HashClusterNode
路由的工作方式
Site
Pool
Hash
调用服务示例
调用服务之前,先注册RPC通道
RpcProxyFactory.RegisterClientChannel(newRpcSipcClientChannel());
调用IBS的代码段示例
RpcClientProxyibsClientProxy =
RpcProxyFactory.GetProxy<IUserProfileWpaService> (newIdUri(userIndex.UserId,userIndex.LogicalPoolId, "IBS"));
WpaGetUserInfoArgs userArgs= new WpaGetUserInfoArgs();
userArgs.UserId =userIndex.UserId;
UserInfoAll userInfo =ibsClientProxy.Invoke<WpaGetUserInfoArgs,UserInfoAll>("GetUserInfo", userArgs);
路由的过程,就是通过IdUri找到serverUri的过程。
程序初始化的时候,会执行如下图所示的操作,可以把RouteProvider当做serverUri的生产机器。
给它ServiceName和Policy 它会返回serverUri。
流程图:
总结
调用一个服务之前,先要去RoutePolicy看看这个服务支持的路由策略,然后根据不同的policy确保做了相应配置。
同样,一个服务上线了,如果存在其他服务调用自己的情况,要确保自己routePolicy做了配置并确保对方使用了正确的URI(例如IDCS的 protocol只配置了srv,另一个服务用IdUri是找不到的)。
每个服务在配置路由策略的时候,如果不是hash,在routeTable和routePolicy里面配置路由策略。
如果是hash,在RoutePolicy配置ConfigReference,在HashCluster和HashClusterNode里面配置相应的字段。