Je fais une liste de tâches en utilisant go, grpc et postgres.
Comment diffuser automatiquement des données lors d'un appel postitem
pour insérer de nouvelles données ? Dois-je m'abonner à postgres ou cela peut-il être fait sans abonnement ni abonnement de publication ?
//architecture 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; }
// structure de table postgres
create table task ( id integer not null primary key, name varchar(10) not null );
// Continuer
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 }
Je suppose s.requests
类似于 chan task
。因此,在成功 // update postgres here
Après cela, vous pouvez envoyer votre demande dans 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 }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!