异步日志的java多线程vs jms队列

sqserrrh  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(464)

要求:记录页面视图和表单提交等事件。每页有~1秒的sla。应用程序一次可以有100个并发用户。
日志事件存储在数据库中。
解决方案:我最初的想法是使用异步日志记录方法,其中控件返回到应用程序,日志记录发生在不同的线程中(通过spring的线程池任务执行器)。
然而,有人建议使用jms将是一种更健壮的方法。在使用这种方法时,是否需要额外的工作(设置队列、写入队列、从队列读取)?
在实现这样的东西时(在生产环境中)需要注意哪些最佳实践/事项?

t3irkdon

t3irkdon1#

如果愿意,可以尝试使用完全异步和外部工具。如果你不得不以任何代价坚持你的sla,那么弹性对你来说很重要,你可以尝试使用logstash或者离线处理你的日志。这样,您就可以将应用程序与数据库分离,不再依赖于数据库性能。如果数据库速度很慢,并且您使用的是异步记录器,则队列可能已满。
通过使用gelf的logstash,整个日志处理都在不同的(甚至是远程的)jvm中处理。脱机处理(例如,您编写csv日志)允许您随后将日志数据加载到数据库中。

g0czyy6m

g0czyy6m2#

这两种方法都是有效的,但如果应用程序意外停止,则其中一种方法很容易受到攻击。在第一个场景中,尚未写入数据库的事件将丢失。使用持久的jms队列意味着这些事件将从队列中读取,并在重新启动时持久化到数据库。
当然,如果您的db写操作比将类似大小的消息放入jms队列慢得多,那么您可能解决了错误的问题?

t8e9dugd

t8e9dugd3#

使用jms进行日志记录是完全不匹配的。jms是对mq系列等中间件工具的java抽象。这是完全的杀伤力,并将让您通过设置和配置地狱。jms还允许您将消息放置在事务上下文中,因此您很快就会想到jms可能并不比@rjsang建议的数据库编写好多少。
这并不是说jms不是一种好的技术。如果应用得当,这是一项很好的技术。
对于非同步日志,您最好只依赖一个直接支持它的日志api,比如log4j2。在您的情况下,您可能希望配置 AsyncAppender 用一个 JDBCAppender . log4j2有更多的附加器作为附加选项,包括一个用于jms的附加器。但是,至少通过使用日志抽象,您可以使所有这些都可配置,并且可以在以后更改您的想法。
将来我们可能会有类似于异步cdi事件的东西,它的工作方式应该类似于jms,但会更加轻量级。也许通过将cdi事件与ejb异步方法相结合,您可以获得类似的工作。只要您不使用带有远程接口的ejb,它也应该是相当轻量级的。

相关问题