我正在使用 go、grpc 和 postgres 製作任務清單。
如何在呼叫 postitem
插入新資料時自動串流資料?我需要訂閱 postgres 還是可以在不訂閱或發布訂閱的情況下完成此操作?
// 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; }
// postgres 表架構
create table task ( id integer not null primary key, name varchar(10) not null );
// 繼續
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 }
我猜 s.requests
類似於 chan task
。因此,在成功 // update postgres here
之後,您可以在 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 }
以上是表更改後立即使用 gRPC 傳輸資料庫數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!