yxtiblin
@yxtiblin

Как правильнее реализовать consumer'a rabbitmq в микросервисе grpc на go?

Пишу на Go
Написано несколько микросервисов на grpc gateway и возникла необходимость отправлять и получать сообщения используя RabbitMQ из разных микросервисов. Как пример сервис клиента публикует в брокер сообщения о заказах которые должен получать сервис ресторана. Возник вопрос как наилучшим образом реализовать в сервисе ресторана получение сообщений?

пример proto файла одного из сервисов сервиса ресторана

syntax = "proto3";

package restaurant;
option go_package = "github.com/MSFT/pkg/services/restaurant";

import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "google/api/field_behavior.proto";
import "product.proto";

service MenuService {
    rpc CreateMenu(CreateMenuRequest) returns (CreateMenuResponse) {
        option (google.api.http) = {
            post: "/restaurant/menu"
            body: "*"
        };
    }
    
    rpc GetMenu(GetMenuRequest) returns (GetMenuResponse) {
        option (google.api.http) = {
            get: "/restaurant/menu"
        };
    }
}

message CreateMenuRequest {
    google.protobuf.Timestamp on_date = 1 [(google.api.field_behavior) = REQUIRED];
    google.protobuf.Timestamp opening_record_at = 2 [(google.api.field_behavior) = REQUIRED];
    google.protobuf.Timestamp closing_record_at = 3 [(google.api.field_behavior) = REQUIRED];
    repeated string salads = 4;
    repeated string garnishes = 5;
    repeated string meats = 6;
    repeated string soups = 7;
    repeated string drinks = 8;
    repeated string desserts = 9;
}

message CreateMenuResponse {}

message GetMenuRequest {
    google.protobuf.Timestamp on_date = 1 [(google.api.field_behavior) = REQUIRED];
}

message GetMenuResponse {
    Menu menu = 1 [(google.api.field_behavior) = REQUIRED];
}

message Menu {
    string uuid = 1;
    google.protobuf.Timestamp on_date = 2;
    google.protobuf.Timestamp opening_record_at = 3;
    google.protobuf.Timestamp closing_record_at = 4;
    repeated Product salads = 5;
    repeated Product garnishes = 6;
    repeated Product meats = 7;
    repeated Product soups = 8;
    repeated Product drinks = 9;
    repeated Product desserts = 10;
    google.protobuf.Timestamp created_at = 11;
}


Уточняя вопрос я хочу узнать как лучше внедрить получение сообщений в сервис ресторана (например запустить отдельной горутиной в сервисе), а не как реализовать само получение сообщений из брокера
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
Если я верно понял, вопрос о том как сделать так, чтобы можно было слушать gRPC и RabbitMQ с одного сервиса.
Тогда можно в теле main.go
app := NewApp()
app.Start()

в структуре App можно декларировать ссылки на хэндлеры соединений для gRPC, RabbitMQ.

func (a *App) Start() {
  go listenGRPC()
  go listenMQ()
}


Микросервис запустит 2 горутины, каждая из которых будет слушать и обрабатывать свои соединения независимо.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы