首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我应该为java/grails项目使用哪种StatsD客户端?

我应该为java/grails项目使用哪种StatsD客户端?
EN

Stack Overflow用户
提问于 2013-06-22 03:44:43
回答 2查看 6.8K关注 0票数 19

我正在考虑将StatsD数据收集添加到我的grails应用程序中,并且查看了现有的库和代码,这让我有点困惑,不知道什么是一个好的可伸缩解决方案。为了把这个问题放到上下文中,我正在做一个在线游戏类型的项目,我将自然地监控用户与游戏引擎的交互,这些将自然地聚集在特定的时刻,其中X用户将在一两秒的窗口内执行交互,然后在10-20秒的暂停后重复。

以下是我对目前可用的选项的分析。

Etsy StatsD客户端示例

https://github.com/etsy/statsd/blob/master/examples/StatsdClient.java

“最简单的工作”解决方案,我可以将这个类放到我的项目中,并将一个单例实例实例化为一个spring bean,然后直接使用它。但是,在注意到grails-statsd插件创建了一个客户端实例池之后,我开始怀疑这种方法的可伸缩性。

如果许多线程试图同时发送事件,doSend方法似乎会成为瓶颈,然而,据我所知,由于发送UDP数据包的“即发即忘”特性,这应该会很快发生,从而避免我们通常与网络连接关联的巨大开销。

grails-statsd插件

https://github.com/charliek/grails-statsd/

有人已经为grails创建了一个StatsD插件,其中包含一些很好的特性,比如注解和withTimer方法。但是,我发现这里的实现缺少示例实现中的一些bug修复,比如在调用String.format时指定语言环境。我也不是一个狂热的粉丝,仅仅为了这个而引入apache commons-pool,当一个标准的Executor可以达到类似的效果时。

java-statsd-client

https://github.com/tim-group/java-statsd-client/

这是一个替代的纯java库,它通过维护自己的ExecutorService来异步操作。它支持整个StatsD应用程序接口,包括集和采样,但没有提供任何用于配置线程池和队列大小的钩子。在有问题的情况下,对于非关键的事情,比如监控,我认为我更喜欢有限队列和丢失的事件,而不是让无限队列填满我的堆。

播放statsd插件

https://github.com/vznet/play-statsd/

现在我不能在我的grails项目中直接使用这段代码,但我认为值得一看,看看它是如何实现的。一般来说,我喜欢StatsdClient.scala中的代码构建方式,非常干净和可读性强。似乎也有区域设置错误,但其他功能与etsy示例完全相同。有趣的是,除非有一些我不理解的scala魔术,否则这似乎会为发送到StatsD的每个数据点创建一个新的套接字。虽然这种方法很好地避免了对象池或执行器线程的需要,但我无法想象它是非常高效的,可能会在请求线程中执行DNS查找,而这些查找应该尽快返回给用户。

问题

从所有其他实现似乎都实现了另一种处理并发性的策略这一事实来看,我是否可以假设Etsy示例对于生产使用来说有点太天真了?我的分析看起来像是correct?

  • What java/groovy?

中的其他人正在使用

到目前为止,只要我能接受commons-pool依赖,看起来最好的现有解决方案就是grails插件,但现在我正在认真考虑周日编写自己的版本,将每个实现的最好部分结合在一起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-27 14:56:03

在考虑了一个星期之后,我想我将继续使用现有的grails StatsD插件。这样做的理由是,尽管我可以使用Executor来处理并发,但在不使用对象池的情况下,它仍然会绑定到单个客户端/套接字实例,从理论上讲,这是应用程序中一个相当明显的瓶颈。因此,如果我无论如何都需要一个池,我也可以使用别人已经完成了所有繁重工作的池:)

票数 1
EN

Stack Overflow用户

发布于 2014-07-28 23:39:14

作为java-statsd-client的主要提交者,以及在生产中使用这个库的人,我想尝试消除您对“有一个无限的队列填满我的堆”的担忧。

我认为您在分析Etsy UDP客户端示例时说:“由于发送StatsD数据包的特性,这应该很快就会发生,避免我们通常与网络连接相关的巨大开销。”

据我所知,目前实现java-statsd-client的方式,限制了建立大量出站消息队列的速度,即发送即发即弃UDP数据包的速度。我不是这个领域的专家,但我不知道这会以任何方式阻止,以至于无限队列可能会建立起来。

当您最初进行评估时,java-statsd-client有许多突出的问题(例如,区域/字符编码不明确,以及缺乏采样支持),但这些问题最近已经得到解决。剩下的问题是是否存在填满堆的真正风险。我很希望听到社区对这个问题的看法,如果大家一致认为存在问题,我将很乐意探索在库中引入限制队列。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17243168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档