消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题
实现高性能,高可用,可伸缩和最终一致性架构
使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
我司目前消息队列主要用于日志的处理:日志处理是指将消息队列用在日志处理中,比如微服务的应用,解决大量日志传输的问题。架构简化如下:
日志采集客户端,负责日志数据采集,定时写受写入MQ队列;
MQ消息队列,负责日志数据的接收,存储和转发;
日志处理应用:订阅并消费MQ队列中的日志数据;
我们写个springboot简单的例子:
日志的生产者:
负责收集系统日志,放入消息队列:我们用定时任务简单模拟下:
MagicMqService:
public void wrtiteLogToMQ(SysLog log){
System.out.println("写入日志");
rabbitTemplate.convertAndSend(QUEUENAME, log);
}
@EnableScheduling
@Configuration
public class TaskService {
@Autowired
private MagicMqService magicMqService;
@Scheduled(cron = "0/10 * * * * ?")
public void writelogcron(){
for(int i=0;i<100;i++){
SysLog log=new SysLog();
log.setLogname("hello");
log.setLogdate("2019-05-10");
log.setLogcontent(UUID.randomUUID().toString());
magicMqService.wrtiteLogToMQ(log);
}
}
消费者:从消息队列读取消息,存库:我们使用RabbitHandler 和RabbitListener 实现
@RabbitHandler
@RabbitListener(queues = QUEUENAME)
public void readFromMQ(SysLog sysLogDTO){
System.out.println("读取日志");
System.err.println("从MQ 读取日志:"+sysLogDTO.getLogname()+"内容:"+sysLogDTO.getLogcontent());
}