在本周的 InfoQ 播客中, QCon 主席 Wesley Reisz 与 Tal Weiss 进行了对话。Weiss 是 OverOps 公司的首席执行官,其公司 OverOps 的前身是 Takipi。此次对话的内容涵盖了 OverOps 产品的运作机制,深入探讨了 JVM 的插桩和可观测性之间的区别,谈论了字节码操作的方法和在 Java 开发中的常见错误。
Weiss 在过去的 15 年里设计了很多可扩展的、实时的 Java 和 C++ 应用。他曾经是 VisualTao 公司的联合创始人兼首席执行官,如今这家公司已经在 2009 年被 Autodest 收购。他也曾在 IAI 空间研究所担任软件架构师,主要关注分布式、实时的卫星跟踪技术和相关的控制系统。
关键要点
- OverOps 在应用部署时使用了一种机器代码插桩和静态代码分析的混合技术来构建一个代码的索引。
- 可观测性是指你应该如何设计你的代码架构,才能够从它的输出中捕获有用的信息。插桩是指你通过字节码或者机器码操作技术从系统的外部进入到内部来捕获一些信息,这整个过程发生在系统被设计并构建完成之后。
- 大多数公司都可以从学习字节码插桩技术的过程中受益。字节码不是机器码 —— 而是一个高层级的编程语言。如果能够读懂字节码,会在很大程度上帮助你理解 JVM 的运作机制。
- 有很多的字节码操作工具可以供你使用来操作字节码 —— 比如 ASM 这个为大多数人所知的工具。
- 在一个应用程序的生命周期内,绝大部分的日志记录都来自很小的一部分系统事件。一个很好的习惯是定期去查看你的日志记录,确保你记录了正确的、有价值的信息。
点击播客链接收听
摘要
OverOps
- 1 分 21 秒:OverOps 允许你通过添加到日志文件中的微小连接查看到整个调用堆栈的源代码和变量的状态。
- 3 分 00 秒:为了以一种开销小于 1% 的高性能的方式做到这一点,产品必须定位于 JVM 和处理器之间。
- 3 分 44 秒:OverOps 在应用部署时使用了一种机器代码插桩和静态代码分析的混合技术来构建一个代码的索引。这种机制避免了在运行时环境下使用元数据或者反射。取而代之的是,OverOps 能够在一个底层环境中捕捉到原始的内存状态并且将其重建到源代码中。
SaaS 与 On-Premise
- 5 分 44 秒:OverOps 刚开始时被作为一个 SaaS 产品,但考虑到它收集到的大量数据中含有很多潜在的敏感信息,我们便引入了一个新产品,这个产品被命名为 Hybrid。 Hybrid 会将数据分成两个独立的流:数据流和元数据流。
- 6 分 42 秒:其中,数据流是捕获到的原始数据,然后会对原始数据使用 256 位 AES 加密密钥进行私有加密,这个 256 位 AES 加密密钥只会存储在生产机器上,并且当用户在需要解密时使用。元数据流不包含敏感信息,因为它只是一个抽象的数学图。
- 7 分 18 秒:因为数据流已经被私钥加密,所以该数据流可以被存储在防火墙后面,并且不需要脱离公司的内部局域网。
- 7 分 39 秒:对于一些知名的银行和电信公司而言,法律监管的限制致使他们无法使用这种混合的 SaaS 方法,OverOps 提供了一个后端的 Docker 容器,这个容器允许你在其内部运行整个系统。
- 8 分 24 秒:作为一个初创企业,你需要能够同时进行基于 SaaS 方法和 Docker 容器的内部部署。如果你只进行了基于 SaaS 方法的部署,你将从多个账户中被锁定。
插桩(Instrumentation)与可观测性(Observability)
- 8 分 59 秒:可观测性是指你应该如何设计你的代码架构,才能够从它的输出中捕获有用的信息。插桩是指你通过字节码或者机器码操作技术从系统的外部进入到内部来捕获一些信息,这整个过程发生在系统被设计并构建完成之后。
- 10 分 24 秒:JVM 允许字节码插桩,因此你可以通过补丁来增加额外的字节码,并让 JIT 编译器将这段字节码取出并重新编译。这项技术通常用于性能管理。
- 11 分 14 秒:你还可以像 OverOps 一样进行机器码的插桩。这样做的优点是,你可以在更加接近底层的地方进行操作,这种底层操作会带来很明显的速度上的提升。但是,你必须为特定处理器来编写不同的机器码,这样做会失去平台的独立性,而且这种机器码的编写本身也是很有难度的。
和字节码一起工作
- 11 分 49 秒:大多数公司都可以从学习字节码插桩技术的过程中受益。
- 13 分 32 秒:字节码不是机器码 —— 它是一个高级的编程语言。如果你能够读懂它,它会帮助你更加深入的了解 JVM 的工作机制,比如 JVM 如何进行垃圾收集工作,了解堆栈的跟踪,配置文件等。
- 14 分 30 秒:一个有关字节码有趣的事是,它在 JVM 运行时环境下不是一成不变的。而是可以随着需求不断进行变化的。
- 15 分 46 秒:如果反射机制是一种可以反映对象结构的能力,那么字节码插桩技术就是一种能够反映代码结构的能力。
- 16 分 40 秒:Weiss 为 O’Reilly 制作了一套课程,在课程中他会教你如何进行字节码插桩。你可以在一天之内学会这个技术。所有你需要做的事情就是给一个 JAR 文件添加一个属性,使该文件成为一个代理。这样做最终会给予这个代理可以在 JVM 层级操作代码的权限。
- 17 分 41 秒:一个代理会获得一个在 Main 方法之前执行的函数,这个函数随后会被 JVM 回调,JVM 会在函数内提供一个插桩对象,该对象允许你查看所有已经加载的类和方法,并且你可以随时操作它。
- 18 分 20 秒:有很多的字节码操作工具可以供你使用来操作字节码 —— 比如 ASM 这个为大多数人所知的工具。
- 19 分 04 秒:还有一个名为 ASMifier 的插件,它会在你编写代码的同时,在编辑器中实时显示代码的字节码表示。
- 20 分 12 秒:无论您如何添加字节码,JVM 都会调用字节码验证器检查字节码的语法和有效性。
Java 开发中的常见错误
- 22 分 27 秒:在一个应用程序的生命周期内,绝大部分的日志记录都来自于很小的一部分系统事件。作为架构师,把这些事件之间的关系映射出来是很有必要的。因为有很多在日志里的信息我们是不需要的,但是我们需要的那些可能已经丢失了。
- 25 分 10 秒:通常,错误来自于数据验证和数据处理,数字格式不对或者索引超出范围的错误等,而不是空指针问题。发生的原因是数据总是很容易被损坏。
- 25 分 55 秒:与动态链接有关的类加载错误是另一类很常见的错误。
- 26 分 40 秒:空指针错误是相当少见的,因为开发者们对这个错误都非常敏感。
- 27 分 33 秒:你需要不断的查看日志并且优化它们。
资源
- InfoQ 电子书: Java 代理和字节码。
- Github 上的基础 JVM 代理项目。
- O’Reilly 的课程:调试 Java 和 Scala 语言。
字节码操作框架
- ASM 。Weiss 在 JavaOne 演讲中谈到了 ASM 框架和 Eclipse 插件(Bytecode Outline)
- AspectJ
- BCEL
- Byte Buddy
- CGLIB
- Cojen
- Javassist
- Serp
更多关于播客的信息
你可以通过我们的 RSS feed 来了解关于播客的最新情况,也可通过 SoundCloud 和 iTunes 收听。本页所列出的播客摘要内容均附有可点击链接(英文原文),点击后可直接切换到音频的相关部分。
查看英文原文: Tal Weiss on Observability, Instrumentation and Bytecode Manipulation on the JVM
评论