首頁  >  文章  >  後端開發  >  表更改後立即使用 gRPC 傳輸資料庫數據

表更改後立即使用 gRPC 傳輸資料庫數據

WBOY
WBOY轉載
2024-02-05 11:49:31422瀏覽

表更改后立即使用 gRPC 传输数据库数据

問題內容

我正在使用 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除