2017-01-24 14 views
0

Я ищу способ или лучшее/лучшее решение для решения проблемы регистрации. Я использую актеры Akka в кластерах для своих внутренних служб и играю в интерфейсе, чтобы принимать HTTP-запросы. Мой вопрос прост из старого вопроса о том, чтобы весь журнал приложений был идентифицирован с теми же HTTP-запросами, которые просто используют MDC, который существует в большинстве существующих фреймворков регистрации, генерируя UUID в начале и помещая в контекст ,Группировка/идентификация журналов субъектов для одного и того же «запроса»

Пример нашего потока данных может выглядеть следующим образом:

"Http Request/System A" -> "Actor1/Кластер B" -> "Actor2/Cluster C" -> «Ответ системы А и полный запрос "

Это означает, что в процессе задействованы как минимум 3 отдельные системы. Весь мой журнал отправляется в Логсташ. Я могу сгенерировать UUID с начала запроса из System A. Однако я хочу, чтобы UUID можно было переносить/копировать во все подсистемы, которые все используют сериализацию Protobuf для связи друг с другом, обработки заданий принадлежащих одному и тому же запросу http.

Я знаю, что всегда могу добавить поле id ко всем своим сообщениям, но это очень уродливо.

Мне интересно, есть ли лучший способ или лучший механизм для переноса информации во все другие системы Akka, не представляя слишком много шума для моей бизнес-логики?

+0

«Уродливый» вариант - единственный, о котором я знаю. – Rumoku

+0

Вы можете сделать свое определение генерации детерминированным на основе httprequest, таким образом, все ваши системы будут просто генерировать один и тот же идентификатор при регистрации? – C4stor

+0

@ C4stor Я не совсем уверен, как это можно сделать. Фактически, за исключением точки входа в Систему А, все другие актерские системы получают с использованием протобуфа сериализации, и я думаю, что я был неясно, сожалею об этом. – lunaspeed

ответ

1

Вы можете обернуть свои оригинальные сообщения в контейнер с UUID:

case class MessageWithUuid(message: Any, uuid: UUID) 

Тогда в вашем receive вы должны разворачивать его и сохранить uuid для лесозаготовок:

var uuid: Option[UUID] = 
def receive: Receive = { 
    case MessageWithUuid(message, uuid) => 
    this.uuid = Some(uuid) 
    //TODO: put UUID to MDC logging context 
    receive(message) 
    //TODO: remove UUID from MDC 
    this.uuid = None 
    case ... => 
} 

И всякий раз, когда вы отправить сообщение другому субъекту, вам необходимо обернуть его с помощью UUID:

def send(actor: ActorRef, message: Any) = actor ! MessageWithUuid(message, uuid.get) 
+0

это похоже на «id везде», но действительно лучшее решение. однако я забыл упомянуть, что я использую сериализацию Протобуфа, и отредактировал свой пост, что кажется тревожным для такого подхода. – lunaspeed

 Смежные вопросы

  • Нет связанных вопросов^_^