Navrhujeme architektúru Microervices, radi by sme použili RabbitMQ ako sprostredkovateľa správ.
Chceli sme, aby každá služba mala jeden konkrétny front, povedzme applicationQueue
.
Taktiež sme definovali, že naše posolstvá budú dvojakého druhu:
Diania: Správy, ktoré sú smerované na každú službu. Ak sa služba zaujíma o nejakú konkrétnu udalosť, zachytí ju a vytvorí úloha od toho.
Úlohy: Správy reprezentujúce pracovné miesta vytvorené zo služby pre seba, mali by byť publikované iba do frontu služby samotnej
Snažíme sa o jeho implementáciu pomocou programu Spring AMQP.
Navrhli sme producenta správ, takže po danej http požiadavke by vytvoril úlohu pre samotnú službu:
RestController:
@PostMapping
public void saveProduct(@RequestBody Product product) {
messageProducer.message("subscriptions.product.create", product)
.fromHttpRequest(requestContext)
.send();
}
náš spôsob odoslania výrobcu správy:
public void send() {
template.convertAndSend(exchange, routingKey, payload, message -> {
if (requestContext != null) {
extractHttpRequestInfo(message);
message.getMessageProperties().getHeaders()
.put(MessageDictionary.TRANSACTION_ID, generateTransactionId());
} else if (originalMessage != null) {
extractMessageInfo(message);
}
return message;
});
}
Konfigurácia RabbitMQ:
@Bean
List<Binding> binding(Queue queue, TopicExchange exchange) {
return Arrays.asList(
BindingBuilder.bind(queue).to(exchange).with("*.*"),
BindingBuilder.bind(queue).to(exchange).with("${condohub.rabbitmq.queue.name}.#")
);
}
a potom sa prihláste inde (. \ t @Digest
anotácia je vlastná anotácia):
@Digest("${condohub.rabbitmq.queue.name}.product.create")
public void createProduct(Product product) {
service.save(product);
}
Akákoľvek pomoc je vítaná.
odpovede:
1 pre odpoveď č. 1Vaše viazania nedávajú zmysel, prvý bude zodpovedať všetkým kľúčom s formulárom foo.bar
, baz.qux
atď., takže druhá je irelevantná.
Pravdepodobne by ste mali použiť výmenu fanoutovpre podujatia a každá služba má 2 fronty, jednu na fanout pre podujatia a jednu na tému výmena za pracovné miesta (s úzkym záväzkom len pre vlastné pracovné miesta).