消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题
实现高性能,高可用,可伸缩和最终一致性架构
使用较多的消息队列有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()); }