У меня есть пара функций, и каждая функция создает журналы, относящиеся к одной транзакции; Это многопоточное приложение, поэтому запись функции в func1 может быть случайной для выполненной транзакции, но для одиночной транзакции она будет проходить только через порядок func1, func2 и func3.
func1(transactionId) {
log("%d Now in func1", transactionId);
}
func2(transactionId) {
log("%d Now in func2", transactionId);
}
func3(transactionId) {
log("%d Now in func3", transactionId);
}
Теперь я хочу записывать в logstash сразу для каждой транзакции ТОЛЬКО за раз; то есть
1 Now in func1 Now in func2 Now in fun3
а затем нужно перейти, наконец, к elasticsearch;
Я думал о том, чтобы записать половину журнала транзакций во временную очередь RabbitMQ, а затем, по завершении полной транзакции, я передам его в очередь производителя RabbitMQ, чтобы отправить сообщение в logstash;
Нравиться
func1(transactionId) {
add2RMQ(transactionId, "Now in func1");
}
func2(transactionId) {
add2RMQ("transactionId, "Now in func2");
}
func3(transactionId) {
add2RMQ("transactionId, "Now in func3");
/* Last point of transaction */
commit2RMQ(transactionId);
}
Во время выполнения commit2RMQ logstash должен получить полное сообщение, относящееся к транзакции, для записи в elasticsearch.
Вопрос:
- Как правильно решить эту проблему, чтобы сразу отправлять данные, относящиеся к транзакции, в elasticsearch?
- Можем ли мы решить эту проблему с помощью RabbitMQ? Если да, то какой правильный API мне нужно использовать для этого?
- Есть ли способ добиться того же без RabbitMQ, но только с logstash и elasticsearch?
- Я не хочу использовать API обновления elasticsearch, поскольку он может потребовать много операций поиска для каждого сообщения журнала, относящегося к транзакции.