Как организовать обработку задержанных результатов в коммуникации микросервисов? - PullRequest
0 голосов
/ 27 января 2020

У меня есть следующая система: мой сервер Rails выдает команды серверу Flask, а последний отвечает сразу со статусом 200. После этого сервер Flask запускает фоновую задачу с некоторой трудоемкой функцией. Через некоторое время он дает некоторые результаты и предназначен для отправки данных обратно на сервер Rails через HTTP (см. Диаграмму) enter image description here

Каждая часть данных Flask может влиять несколько моделей Rails (User, Post et c ...). Здесь я столкнулся с двумя вопросами:

  1. Как мне в этом случае структурировать свои контроллеры / действия на стороне Rails? В настоящее время я думаю об одном контроллере, и каждое его действие соответствует Python «задержанной» порции данных.
  2. Это нормальный способ связи микросервисов? Или я могу организовать это другим, более простым способом?

1 Ответ

1 голос
/ 28 января 2020

Это похоже на ваш стандартный процесс webhook. Rails высовывает Flask с помощью запроса GET или POST, а Flask через некоторое время откатывается назад.

Например, допустим, у нас есть отчеты, и после создания отчета нам нужно flask для проверки отчета:

class ReportsController
  # POST /reports
  def create
    @report = Report.new(report_params)
    if @report.save
      FlaskClient.new.verify(report) # this could be delegated to a background job
      redirect_to @report
    else
      render :new
    end
  end

  # PATCH /reports/:id/verify
  def verify
    # process request from flask
  end
end

class FlaskClient
  include Httparty

  base_uri 'example.com/api'
  format 'json'

  def verify(report)
    self.class.post('/somepath', data: { id: report.id, callback_url: "/reports/#{report.id}/verify", ... })
  end
end

Конечно, приложение Rails фактически не знает, когда Flask ответит или что Flask и фоновая служба отличаются. Он просто отправляет и отвечает на запросы http. И вы определенно не хотите, чтобы рельсы ждали, так что сохраните то, что у вас есть, и затем хук может обновить данные.

Если вам нужно обновить пользовательский интерфейс на стороне Rails без необходимости обновления пользователем sh вручную вы можете использовать опрос или веб-сокеты в виде ActionCable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...