// import "github.com/Diarkis/diarkis/datacapsule" // This is used to handle to transported data// cmdID is a unique ID for the internal command similar to HTTP URLmesh.Command(cmdID, handleInternalCommand)funchandleInternalCommmand(req map[string]interface{}) (map[string]interface{}, error) {// request parameters question := mesh.GetInt(req, "question") userMessage := mesh.GetBytes(req, "message") messageData :=make([]byte, 0)switch question {case1: messageData =CreateMessageDataForCaseOne(userMessage)case2: messageData =CreateMessageDataForCaseTwo(userMessage)default:returnnil, errors.New("Invalid question") } cp := datacapsule.NewCapsule() cp.SetAsBytes("messageData", messageData)// returned value of cp.Export() will be sent as a response datareturn cp.Export(), nil}
リクエスト送信
requestParams :=make(map[string]interface{})requestParams["question"] =1requestParams["message"] = userMessage// cmdID is a unique ID for the internal command similar to HTTP URLmesh.SendRequest(cmdID, receiverAddr, requestParams, func(err error, res map[string]interface{}) {if err !=nil {// handle the error herereturn } responseCapsule := datacapsule.NewCapsule() responseData, err := responseCapsule.Import(res)if err !=nil {// handle error here } logger.Debug("We have the response %v - error? %v", responseData.GetAsBytes("messageData"))})
複数のサーバノードへのメッセージの送信
以下は、リモートのサーバノードが応答を送信することを期待しない通信です。
受信者
mesh.Command(commandID, handleCommand)funchandleCommand(req map[string]interface{}) (error, map[string]interface{}) {message := mesh.GetString(req, "message") id := mesh.GetUint32("id") timestamp :=GetInt64("timestamp") logger.Debug("Do something with %s of %v and %v", message, id, timestamp)// We do not send a responsereturnnil, nil}
送信者
// All UDP server node addressesudpNodes := mesh.GetNodeAddressesByType(udp.Type)// Message data to be delivereddata :=make(map[string]interface{})data["message"] = messagedata["id"] = messageID // messageID is uint32Data["timestamp"] = timestamp // timestamp in milliseconds is int64// deliveryLimit is the number of server nodes to send the message to simultaneouslydeliveryLimit :=2// This is a reliable message delivery to guarantee the delivery of the message to all server nodesmesh.SendMany(commandID, udpNodes, data, deliveryLimit)/// This is an unreliable message delivery: faster and cheaper, but not reliablemesh.USendMany(commandID, udpNodes, data, deliveryLimit)
// Check to see if a specific server node is online or notonline := mesh.IsNodeOnline(nodeMeshAddr)// Check to see if itself is online or notamIOnline := mesh.IsMyNodeOnline()