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.
 
 
 
 
 
 

445 lines
18 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sog;
using Sog.Service;
using ProtoCSStruct;
namespace DB
{
public class DBMsgHandler : BaseReloadableService
{
public override int GetServiceType()
{
return DBServiceType.DBMsgHandler;
}
//销毁
public override void Dispose()
{
}
public void HandlerMessage(uint remoteAppID, MessageData message)
{
StructPacket packet;
bool bSuccess = DBServerUtils.GetProtoPacker().UnpackMessage(message, out packet);
if(bSuccess == false)
{
TraceLog.Error("HandlerMessage ,unpack msg failed {0}, remoteAppID {1}", message.Header.Type, remoteAppID);
return;
}
//因为需要放入每个线程的队列,所以需要clone 一个新的对象,UnpackMessage出来的消息每次其实是同一个
//如果存在性能问题,可以根据消息类型进行缓冲
packet = packet.Clone();
//预先判断,提高效率
if (TraceLog.GetLogLevel() <= (int)Sog.Log.LogLevel.TraceDetail
&& TraceLog.IsSkipLogMsgID(packet.MsgID) == false)
{
TraceLog.TraceDetail("recv message from server {0}, message type {1} length {2} : {3}->{4}"
, ServerIDUtils.IDToString(remoteAppID)
, message.Header.Type
, message.Header.Length
, packet.MessageName()
, packet.ToString());
}
switch (packet.MsgID)
{
case (int) SSMsgID.QueryAccountDb:
OnQueryAccountDBReq(remoteAppID, packet);
break;
case (int)SSMsgID.UpdateAccountGradeDbReq:
OnUpdateAccountGradeDbReq(remoteAppID, packet);
break;
case (int) SSMsgID.QueryDbSnsFriendAccountReq:
OnQueryDbSnsFriendAccountReq(remoteAppID, packet);
break;
case (int) SSMsgID.BindGuestFacebookDbReq:
OnBindGuestFacebookDbReq(remoteAppID, packet);
break;
case (int) SSMsgID.UnbindGuestFacebookDbReq:
OnUnbindGuestFacebookDbReq(remoteAppID, packet);
break;
case (int) SSMsgID.QueryUidByFbuseridReq:
OnQueryUidByFbuseridReq(remoteAppID, packet);
break;
case (int)SSMsgID.QueryUidByWxidReq:
OnQueryUidByWxidReq(remoteAppID, packet);
break;
case (int) SSMsgID.ChangeFacebookUidDbReq:
OnChangeFacebookUidDbReq(remoteAppID, packet);
break;
case (int) SSMsgID.UpdateAccountLastloginrealm:
OnUpdateAccountLastLoginRealm(remoteAppID, packet);
break;
case (int) SSMsgID.LoginCheckValidReq:
OnLoginCheckValidReq(remoteAppID, packet);
break;
case (int)SSMsgID.RealmRoleBriefReq:
OnRealmRoleBriefReq(remoteAppID, packet);
break;
case (int)SSMsgID.UpdateRealmRoleBrief:
OnUpdateRealmRoleBrief(remoteAppID, packet);
break;
case (int)SSMsgID.QueryRealmUidDataReq:
OnQueryRealmUidDataReq(remoteAppID, packet);
break;
case (int)SSMsgID.SaveRealmUidDataReq:
OnSaveRealmUidDataReq(remoteAppID, packet);
break;
case (int)SSMsgID.SsRealmDbqueryReq:
OnQueryRealmDBReq(remoteAppID, packet);
break;
case (int)SSMsgID.SsRealmDbsaveReq:
OnSaveRealmDBReq(remoteAppID, packet);
break;
case (int)SSMsgID.SsRealmSavePlayernum:
OnSSRealmSavePlayerNum(remoteAppID, packet);
break;
//pay
case (int)SSGameMsgID.GmQueryUserPayRecordReq:
OnGmQueryUserPayRecordReq(remoteAppID, packet);
break;
case (int) SSGameMsgID.PayGoogleReq:
OnPayGoogleReq(remoteAppID, packet);
break;
case (int)SSGameMsgID.PayGoogleSuccessReq:
OnPayGoogleSuccReq(remoteAppID, packet);
break;
case (int)SSGameMsgID.PayDbAddDiamondStatusReq:
OnPayDBAddDiamondStatusReq(remoteAppID, packet);
break;
case (int)SSGameMsgID.QueryPayGoogleSuccOrder:
OnQueryPayGoogleSuccOrder(remoteAppID, packet);
break;
case (int)SSGameMsgID.GmQueryUserAccountinfoReq:
OnQueryAccountInfoReq(remoteAppID, packet);
break;
case (int)SSGameMsgID.PayHeroSaveHttpContentReq:
OnSaveHttpContentReq(remoteAppID, packet);
break;
case (int)SSGameMsgID.PayHeroSelectHttpContentReq:
OnSelectHttpContentReq(remoteAppID, packet);
break;
case (int)SSGameMsgID.PayHeroDeleteHttpContentNotify:
OnDeleteHttpContentNotify(remoteAppID, packet);
break;
case (int)SSMsgID.SendGifts:
SSSendGift(remoteAppID, packet);
break;
default:
TraceLog.Error("DBMsgHandler unknow MsgID {0}", packet.MsgID);
break;
}
}
private int CalcTaskIndex(int accountType, string accountID)
{
string strHash = AccountUtils.CalcAccountKey(accountType, accountID);
int index = AccountUtils.HashStringForIndex(strHash) % (int)MessageTaskDistributor.Instance.TaskCount;
return index;
}
private int CalcRankTaskIndex(int realmId)
{
int index = 1 % (int)MessageTaskDistributor.Instance.TaskCount;
return index;
}
private void OnQueryAccountDBReq(uint remoteAppID, StructPacket packet)
{
ref SSQueryAccountInfoDB queryAccountDbReq = ref packet.GetMessage<SSQueryAccountInfoDB>();
int iTaskIndex = CalcTaskIndex(queryAccountDbReq.CSAccountAuthReq.Account.AccountType
, queryAccountDbReq.CSAccountAuthReq.Account.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
return;
}
private void OnQueryDbSnsFriendAccountReq(uint remoteAppID, StructPacket packet)
{
ref SSQueryDBSnsFriendAccountReq req = ref packet.GetMessage<SSQueryDBSnsFriendAccountReq>();
int iTaskIndex = CalcTaskIndex(req.AccountType, req.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnBindGuestFacebookDbReq(uint remoteAppID, StructPacket packet)
{
ref SSBindGuestFacebookDbReq req = ref packet.GetMessage<SSBindGuestFacebookDbReq>();
int iTaskIndex = CalcTaskIndex(req.AccountInfo.AccountType, req.AccountInfo.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnUnbindGuestFacebookDbReq(uint remoteAppID, StructPacket packet)
{
ref SSUnbindGuestFacebookDbReq req = ref packet.GetMessage<SSUnbindGuestFacebookDbReq>();
int iTaskIndex = CalcTaskIndex(req.AccountInfo.AccountType, req.AccountInfo.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnQueryUidByFbuseridReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSQueryUidByFbuseridReq>();
int iTaskIndex = CalcTaskIndex((int)AccountType.AccountType_Facebook, req.Fbuserid.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnQueryUidByWxidReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSQueryUidByWXIDReq>();
int iTaskIndex = CalcTaskIndex((int)AccountType.AccountType_WX, req.Wxid.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnChangeFacebookUidDbReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSChangeFacebookUidDbReq>();
int iTaskIndex = CalcTaskIndex(req.AccountType,req.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnUpdateAccountLastLoginRealm(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSUpdateAccountLastLoginRealm>();
int iTaskIndex = CalcTaskIndex(req.AccountType, req.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnLoginCheckValidReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSLoginCheckValidReq>();
int iTaskIndex = CalcTaskIndex(req.AccountInfo.AccountType, req.AccountInfo.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnRealmRoleBriefReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSRealmRoleBriefReq>();
int iTaskIndex = CalcTaskIndex(req.AccountType, req.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnUpdateRealmRoleBrief(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSUpdateRealmRoleBrief>();
int iTaskIndex = CalcTaskIndex(req.AccountType, req.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnQueryFriendListReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSQueryFriendListReq>();
int iTaskIndex = (int)(req.Uid % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnQueryFriendInfoCacheReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSQueryFriendInfoCacheReq>();
int iTaskIndex = (int)(req.Uid % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnSaveFriendListReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSSaveFriendListReq>();
int iTaskIndex = (int)(req.Uid % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnPayGoogleReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSPayGoogleReq>();
int iTaskIndex = (int)(req.Uid % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnGmQueryUserPayRecordReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSGmQueryUserPayRecordReq>();
int iTaskIndex = (int)(req.UID % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnPayGoogleSuccReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSPayGoogleSuccessReq>();
int iTaskIndex = (int)(req.Uid % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnPaySendDBRefundReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSPaySendDBRefundReq>();
int iTaskIndex = (int)(req.Uid % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnPayDBAddDiamondStatusReq(uint remoteAppID, StructPacket packet)
{
int iTaskIndex = (int)(packet.ObjectID % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnQueryPayGoogleSuccOrder(uint remoteAppID, StructPacket packet)
{
int iTaskIndex = (int)(packet.ObjectID % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnQueryAccountInfoReq(uint remoteAppID, StructPacket packet)
{
ref SSGmQueryUserAccountInfoReq req = ref packet.GetMessage<SSGmQueryUserAccountInfoReq>();
int iTaskIndex = CalcTaskIndex(req.AccountType, req.Account.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnSaveHttpContentReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSPayHeroSaveHttpContentReq>();
int iTaskIndex = (int)(req.Http.Uid % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnSelectHttpContentReq(uint remoteAppID, StructPacket packet)
{
// 定期检查(60s或者300s)是否有http记录未成功提交到hero的服务器, 频率非常低, 固定用线程1处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, 0);
}
private void OnDeleteHttpContentNotify(uint remoteAppID, StructPacket packet)
{
ref var notify = ref packet.GetMessage<SSPayHeroDeleteHttpContentNotify>();
int iTaskIndex = (int)(notify.Uid % (int)MessageTaskDistributor.Instance.TaskCount);
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void SSSendGift(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSSendGift>();
int iTaskIndex = CalcTaskIndex(req.AccountType, req.AccountId.GetString());
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnUpdateAccountGradeDbReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSUpdateAccountGradeDbReq>();
int iTaskIndex = CalcTaskIndex(req.AccountInfo.AccountType, req.AccountInfo.AccountID.GetString());
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnQueryRealmUidDataReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSQueryRealmUidDataReq>();
int iTaskIndex = (int)(req.RealmId % (int)MessageTaskDistributor.Instance.TaskCount);
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnSaveRealmUidDataReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSSaveRealmUidDataReq>();
int iTaskIndex = (int)(req.RealmId % (int)MessageTaskDistributor.Instance.TaskCount);
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnQueryRealmDBReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSRealmDBQueryReq>();
int iTaskIndex = (int)(1 % (int)MessageTaskDistributor.Instance.TaskCount);
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnSaveRealmDBReq(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSRealmDBSaveReq>();
int iTaskIndex = (int)(1 % (int)MessageTaskDistributor.Instance.TaskCount);
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
private void OnSSRealmSavePlayerNum(uint remoteAppID, StructPacket packet)
{
ref var req = ref packet.GetMessage<SSRealmSavePlayerNum>();
int iTaskIndex = (int)(1 % (int)MessageTaskDistributor.Instance.TaskCount);
//转给任务线程处理
MessageTaskDistributor.Instance.Distribute(remoteAppID, packet, iTaskIndex);
}
}
}