美文网首页
JavaWeb项目架构之Redis分布式日志队列

JavaWeb项目架构之Redis分布式日志队列

作者: 暖夏未眠丶 | 来源:发表于2018-01-17 16:26 被阅读116次

摘要: 架构、分布式、日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了。 为什么需要消息队列? 当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。

架构、分布式、日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了。

为什么需要消息队列?

当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。

比如我们系统中常见的邮件、短信发送,把这些不需要及时响应的功能写入队列,异步处理请求,减少响应时间。

如何实现?

成熟的JMS消息队列中间件产品市面上有很多,但是基于目前项目的架构以及部署情况,我们采用Redis做消息队列。

为什么用Redis?

Redis中list数据结构,具有“双端队列”的特性,同时redis具有持久数据的能力,因此redis实现分布式队列是非常安全可靠的。

它类似于JMS中的“Queue”,只不过功能和可靠性(事务性)并没有JMS严格。Redis本身的高性能和"便捷的"分布式设计(replicas,sharding),可以为实现"分布式队列"提供了良好的基础。

提供者端

项目采用第三方redis插件spring-data-redis,不清楚如何使用的请自行谷歌或者百度。

redis.properties:

#redis 配置中心

redis.host=192.168.1.180

redis.port=6379

redis.password=123456

redis.maxIdle=100

redis.maxActive=300

redis.maxWait=1000

redis.testOnBorrow=true

redis.timeout=100000

redis配置:

切面日志配置(伪代码):

/**

* 系统日志,切面处理类

* 创建者 小柒2012

* 创建时间    2018年1月15日

*/@Component@Scope@AspectpublicclassSysLogAspect{@AutowiredprivateRedisTemplate redisTemplate;//注解是基于swagger的API,也可以自行定义@Pointcut("@annotation(io.swagger.annotations.ApiOperation)")publicvoidlogPointCut(){    }@Around("logPointCut()")publicObjectaround(ProceedingJoinPoint point)throwsThrowable{        Object result = point.proceed();//把日志消息写入itstyle_log频道redisTemplate.convertAndSend("itstyle_log","日志数据,自行处理");returnresult;    }}

消费者端

Redis配置:

监听接口:

publicinterfaceMessageDelegateListener{publicvoidhandleLog(Serializable message);}

监听实现:

publicclassMessageDelegateListenerImplimplementsMessageDelegateListener{@OverridepublicvoidhandleLog(Serializable message){if(message ==null){                System.out.println("null");            }else{//处理日志数据}        }}

Q&A

【问题一】为什么使用Redis?

上面其实已经有做说明,尽管市面上有许多很稳定的产品,比如可能大家会想到的Kafka、RabbitMQ以及RocketMQ。但是由于项目本身使用了Redis做分布式缓存,基于省事可行的原则就选定了Redis。

【问题二】日志数据如何存储?

原则上是不建议存储到关系数据库的,比如MySql,毕竟产生的日志数量是巨大的,建议存储到Elasticsearch等非关系型数据库。

【问题三】切面日志收集是如何实现的?

切面日志需要引入spring-aspects相关Jar包,并且配置使Spring采用CGLIB代理 。

开源项目源码(参考):https://gitee.com/52itstyle/spring-boot-mail

作者: 小柒

出处: https://blog.52itstyle.com

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

原文链接

相关文章

网友评论

      本文标题:JavaWeb项目架构之Redis分布式日志队列

      本文链接:https://www.haomeiwen.com/subject/nkeuoxtx.html