2

機能は次のようなものです:

func Message(worker_ID int, message string, args *Args , reply *int) chan bool {
}

この関数は、クライアントがホストにメッセージを送信するときに呼び出されるホストに存在します。ホストは別の場所にあるため、メッセージを正しく送信するにはIPとポートの両方が必要ですか?どのメカニズムが役立つnet.dial()か、gobまたはrpc

4

2 に答える 2

2

単純なものが必要な場合は、 gobとネットワークをリモートプロシージャコールフレームワークにラップするnet / rpcを確認してください。これにより、必要な処理が実行されます。

サーバ

ドキュメントから、HTTP上で実行されているサーバー

type Args struct {
        A, B int
}

type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error {
        *reply = args.A * args.B
        return nil
}

arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, e := net.Listen("tcp", ":1234")
if e != nil {
        log.Fatal("listen error:", e)
}
go http.Serve(l, nil)

クライアント

この時点で、クライアントはメソッド「Arith.Multiply」を使用してサービス「Arith」を表示できます。1つを呼び出すには、サーバーにダイヤルしてから電話をかけます。結果がチャネルに返される非同期呼び出しを行うこともできます。

client, err := rpc.DialHTTP("tcp", serverAddress + ":1234")
if err != nil {
        log.Fatal("dialing:", err)
}

args := &server.Args{7,8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
        log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)

フレームワークの少し奇妙な点は、各リモート呼び出しが1つの入力引数と1つの出力引数しか持てないことです。つまり、すべての引数をでラップする必要がありますstruct

于 2013-01-06T11:25:38.493 に答える
1

//server.goは、ホストとの通信と処理のためのインターフェースを提供します

// workerDead(message string)、メッセージを送信し、ackがない場合は、ワーカーが死んでいることを意味する場合はackを待ちます

package
main
import(

"fmt"
"io"
"net"
"net/http"
"net/rpc"
"path"
"os"
)

type Flag int
type Args struct{
message string
}
func main() {

flag := new(Flag)
rpc.Register(flag)
rpc.HandleHTTP()
err := http.ListenAndServe(":1234", nil) //ListenAndServe starts an HTTP server with a given address and handler.
//The handler is usually nil, which means to use DefaultServeMux.
if err != nil {
fmt.Println(err.Error())
}
}

//Worker counts the number of hosts
func workerCount() int
{
return db.runCommand( { count: 'id' } ) //mongodb command to count the id
}

// Returns an array of the distinct values of field id from all documents in the workers collection
//In mongodb document is analogous to rdbms table and collection is record

func Worker(worker int) []string{
return db.runCommand ({ distinct: 'workers', key: 'id' } ) //mongodb command to get the array of list of
//workers for column id
}

func Message(worker int, message string, args *Args , reply *int) chan bool {


server, err :=rpc.Dial("tcp","192.168.23.12") //Serve Dials here to send message to host, IP address here is of host
if(err!=nil){
log.Fatal("Dialing", err)
}
var reply bool
args:=Args{message};
err = server.Call(args,&reply);
if(err!=nil){
log.Fatal("Dialing", err)
replaceWorker(); // No reply from worker then call to replace worker
}
fmt.Println("Reply from host", reply);

}
return nil
}
//Replace dead worker of particular project with fresh worker
func replaceWorker(worker_id int,project_id int)
{
db.workers.update( //this query updates workers collection with id=worker_id(id of dead worker)
   { _id: worker_id, _project_id: project_id },
   {
     //$set: { ' ': 'Warner' },
   }

)

}
于 2013-01-08T04:07:52.707 に答える