Maison > développement back-end > Golang > 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
Libérer: 2024-02-05 11:49:31
avant
510 Les gens l'ont consulté

表更改后立即使用 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;
}

Copier après la connexion

// structure de table postgres

create table task (
  id integer not null primary key,
  name varchar(10) not null
);
Copier après la connexion

// 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
}

Copier après la connexion


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
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal