Saya sedang membuat senarai tugas menggunakan go, grpc dan postgres.
Bagaimana untuk menstrim data secara automatik semasa memanggilpostitem
untuk memasukkan data baharu? Adakah saya perlu melanggan postgres atau bolehkah ini dilakukan tanpa melanggan atau menerbitkan melanggan?
// seni bina protobuf
syntax = "proto3"; package tasklist; import "google/protobuf/empty.proto"; service todolist { rpc gettasks(google.protobuf.empty) returns (stream gettasksresponse) {} rpc postitem(postitemrequest) returns (posttaskrequest) {} } message task { int64 id = 1; string name = 2; } message gettasksresponse { task task = 1; } message posttaskrequest { task task = 1; } message postitemresponse { bool result = 1; }
// struktur jadual postgres
create table task ( id integer not null primary key, name varchar(10) not null );
// Teruskan
func (s *server) GetTasks(_ *empty.Empty, stream pb.TaskList_GetTasksServer) error { // How can I steam data as soon as `PostTask` is called to update db? <- <- for _, r := range s.requests { // stream data } } func (s *server) PostTask(ctx context.Context, r *pb.PostTaskRequest) (*pb.PostTaskResponse, error) { // update Postgres here return &pb.PostItemResponse{Result: true}, nil }
Saya rasas.requests
类似于chan task
。因此,在成功// update postgres here
Selepas itu anda boleh menghantar permintaan anda dalam chan.
func (s *server) PostTask(ctx context.Context, r *pb.PostTaskRequest) (*pb.PostTaskResponse, error) { postTask := toDomain(r) err := s.service.UpdateTask(ctx, postTask) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } s.requests <- postTask return &pb.PostItemResponse{Result: true}, nil }
Atas ialah kandungan terperinci Gunakan gRPC untuk memindahkan data pangkalan data serta-merta selepas perubahan jadual. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!