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

Utilisez gRPC pour transférer les données de la base de données immédiatement après les modifications de la table

WBOY
WBOYavant
2024-02-05 11:49:31422parcourir

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

Contenu de la question

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
}


Bonne réponse


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer