Documentos de Académico
Documentos de Profesional
Documentos de Cultura
docker run -d --hostname rabbit3 --name rabbit3 --link rabbit1:rabbit1 --link rabbit2:rabbit2
-e RABBITMQ_ERLANG_COOKIE='rabbitcluster' -p 30004:5672 -p 30005:15672
rabbitmq:management
@SpringBootApplication
@EnableRabbit
public class Listener {
private static Logger logger = Logger.getLogger("Listener");
private Long timestamp;
public static void main(String[] args) {
SpringApplication.run(Listener.class, args);
}
@RabbitListener(queues = "q.example")
public void onMessage(Order order) {
if (timestamp == null)
timestamp = System.currentTimeMillis();
logger.info((System.currentTimeMillis() - timestamp) + " : " +
order.toString());
}
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new
CachingConnectionFactory();
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setAddresses("192.168.99.100:30000,192.168.99.100:30002
,192.168.99.100:30004");
connectionFactory.setChannelCacheSize(10);
return connectionFactory;
}
@Bean
public SimpleRabbitListenerContainerFactory
rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new
SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrentConsumers(10);
factory.setMaxConcurrentConsumers(20);
return factory;
}
@Bean
public Queue queue() {
return new Queue("q.example");
}
}
@SpringBootApplication
public class Sender {
private static Logger logger = Logger.getLogger("Sender");
@Autowired
RabbitTemplate template;
public static void main(String[] args) {
SpringApplication.run(Sender.class, args);
}
@PostConstruct
public void send() {
for (int i = 0; i < 100000; i++) {
int id = new Random().nextInt(100000);
template.convertAndSend(new Order(id, "TEST"+id,
OrderType.values()[(id%2)]));
}
logger.info("Sending completed.");
}
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new
CachingConnectionFactory();
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setAddresses("192.168.99.100:30000,192.168.99.100:30002
,,192.168.99.100:30004");
return connectionFactory;
}
@Bean
public RabbitTemplate template() {
RabbitTemplate rabbitTemplate = new
RabbitTemplate(connectionFactory());
rabbitTemplate.setExchange("ex.example");
return rabbitTemplate;
}
}
Propuesta para la creación de multiples hilos en el grupo de clusters
un grupo dinámico de consumidores, cada uno de ellos con un solo trabajador asociado y
obteniendo de su propio canal de procesos; Es decir, tendremos tantos consumidores y
canales como trabajadores.
a dynamic pool of consumers, each of them with a single associated worker and fetching
from their own broker channel; this is, we will have as many consumer and channels as we
have workers
En conclusión
La configuración de agrupamiento y alta disponibilidad con RabbitMQ es bastante
simple. Rabbit MQ es popular por su soporte en el proceso de monitoreo de clústeres con la
consola de administración de UI. Es fácil de usar e intuitivo.
Otras ventajas
RabbitMQ admite principalmente el intercambio de mensajería basado en cola y asíncrono. Esto
permite al remitente enviar tantos mensajes como sea posible sin importar si se procesan en el destino.
Referencias:
https://blog.flux7.com/blogs/tutorials/how-to-creating-highly-available-message-
queues-using-rabbitmq
https://www.codeproject.com/Articles/1101424/Create-Microservice-with-Spring-AMQP-
and-RabbitMQ
Como trabaja la persistencia en rabbitMQ y como se configura aquí ver configuración efectiva aquí
ejemplo de archivo de configuración
Archivo de configuración
Cluster Formation and Peer Discovery Agrupación declarativa desde DNS en el archivo de
configuración:
cluster_formation.peer_disc:overy_backend = rabbit_peer_discovery_dns