2010-11-18 43 views
4

这里是我的问题:我试图调试Apache卡桑德拉和理解应用程序的流程。即当客户端发送请求时,比如put(),调用哪些方法以及系统如何在内部工作。大型服务器端如何调试分布式Java应用程序

所以,这里是我的想法:

  1. 写这就要求进入put()方法的点卡桑德拉代码的重要手段,把断点在Eclipse等等等等OR
  2. 别•编写一个主要方法,只需使用常规客户端(通过TCP访问服务器)和“调试”(通过读取日志文件并理解代码)使用log4j记录器(已在cassandra中实现)。

所以,我的问题是,调试这种分布式应用程序的理想方式是什么?

回答

3

理想的方式?两者以及更多。

你提到的目标:“调试”和“了解应用程序的流程” - 确定它很难做,你懂流之前进行调试,但理解可能是目的本身。

在现实世界中,拥有大型分布式系统上打交道时,往往无法依靠调试器,至少在最初阶段,这不仅是因为有些问题只出现在系统繁忙或运行小时后。因此,在应用程序代码和基础架构代码中,良好的调试跟踪以及对该跟踪的细粒度控制非常重要。

但是,如果你要在一个调试器,可以说是相当照明运行的机会。

在此之前,我认为您需要:

a)。研究可能存在的任何设计文档。

b)中。在一个好的IDE中浏览源代码,例如。蚀。只要按照控制。嗯这里有一个有趣的位,想知道它从哪里来的?在一个类上调用该方法,这有什么作用?什么时候构造函数被调用?

随着头脑中的某些事物的跟踪,跟踪变得更容易,并且您更好地了解将断点放在哪里。

+0

所以,谈论开发者环境的权利?我不关心该应用是否在制作中运行。我的目标是重写cassandra中的一些现有协议。 – zengr 2010-11-18 08:12:02

+0

事实上,最好有一个流动的印象,并验证所产生的预期日志消息。从调试器开始只会让你沉迷于细节,并且你不会对整体情况有所了解(例如流程)。然而,在特定的一段代码上附加一个调试器(不符合你的期望)可以非常有效。 – extraneon 2010-11-18 12:02:14

+0

+我在eclipse中发现远程调试。这也可能有帮助? – zengr 2010-11-22 23:23:22

0

如何使用log4j的MDC,在put()之前设置它,然后在put()退出后清除它?然后你可以看到那里发生了什么,只要你在put()内部执行的方法中设置了其他日志记录。如果您在该方法中的某处深处,请立即记录堆栈跟踪,以便您可以查看当前的位置。

免责声明:我调试的优先级列表是这样的:

  1. 检查堆栈跟踪
  2. 检查日志文件
  3. 使用调试器

所以,如果1和2。不要给我一个答案,我会诉诸调试器。

在这样的分布式应用程序,使用调试器听起来像一个不得已而为之的事情。

0

在分布式应用程序中使用日志记录确实是找出更广泛范围内发生的实际情况以及事情如何相互作用的最佳方法之一。但是你最终会面临日志文件的问题 - 分布式系统可以以各种格式和位置生成大量日志文件。所以,如果你想使用log4j(或类似)这样的东西,你应该将日志聚合到一个地方,然后研究它们。 This tool可能会有所帮助, - 它不仅允许持续聚合,还可以实时监控来自各种来源的聚合日志流。例如,您可以专注于来自特定主机(或主机范围)的数据层,并实时观察发生了什么。或者,您可以从特定机器上的特定线程获取日志,或使用之前发布的海报中提到的MDC上下文。我也正在订阅分布式应用程序中的调试器在大多数情况下毫无用处,并且由于显而易见的原因在生产系统中完全没有用处的观点。另一方面,Log4j非常灵活,广泛使用,是记录日志的最佳工具之一(恕我直言)。

0

使用日志,根据需要增加日志级别添加更多日志语句。在分布式系统的不同组件中,配置不同的组件,如数据库,应用程序服务器,分析堆栈跟踪,在内置前端浏览器的情况下使用调试工具(如果是web应用程序以及后端断点)

相关问题