Maison > Article > développement back-end > Utilisez gRPC pour transférer les données de la base de données immédiatement après les modifications de la table
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!