消息轉發服務器用來接受來自消息隊列的數據,並對其進行解碼、識別等,最後分好類別。比如聊天系統,會將同一個羣組 同一個會話的消息轉發至同一組服務(當然現在還沒實現轉發同一組服務),基本思想爲羣號 QQ號之類弄一個hash然後轉發,或者監控各個服務的負載程度將新開的聊天轉移至相應的聊天服務。如果識別失敗,消息轉發服務器並不會處理消息而是將消息保留至消息隊列並提示,如果需要在線升級添加新的服務,只需要逐步升級消息轉發服務即可。
基本代碼邏輯如下:
// 處理
func DealMsg(delivery amqp.Delivery) {
var json = jsoniter.ConfigCompatibleWithStandardLibrary
var transfer1 transfer
err := json.Unmarshal(delivery.Body, &transfer1)
if err != nil {
fmt.Println(err)
return
}
// from := transfer1.From
var data1 Data
// err = json.Unmarshal(transfer1.Data, &data1)
fmt.Println((string(delivery.Body)))
data1 = transfer1.Data
Type := data1.Type
//delivery.Ack(true)
if err != nil {
fmt.Println("json error1:", err)
return
}
switch Type {
case Login, Register, GetMyFriends, LoseConnect, AddUser, OtherAddFriend, ServerUserChangePassword:
// 轉發給 用戶管理服務
// fmt.Println("發送")
err = mq.Publish(UserControlServer, delivery.Body)
if err != nil {
fmt.Println("RabbitMq:", err.Error())
}
delivery.Ack(true)
case SendUserMsg, ChatHistory, SendGroupMsg:
// 轉發給 消息服務
err = mq.Publish(ChatServer, delivery.Body)
if err != nil {
fmt.Println("RabbitMq:", err.Error())
}
delivery.Ack(true)
case CreateGroup, GetGroupList, GetGroupMember, JoinGroup, OtherAddGroup, ServerInviteUserAddGroup:
// 轉發給 羣組服務
err = mq.Publish(GroupServer, delivery.Body)
if err != nil {
fmt.Println("RabbitMq:", err.Error())
}
delivery.Ack(true)
}
}