0%

项目背景

外呼机器人是基于自动语音识别、文字转语音以及自然语言理解等技术,面向企业客户提供的一款智能客服机器人产品。智能外呼机器人可根据业务场景,自动发起外呼任务,根据客户的意图进行智能应答。

用户在外呼语音智能机器人系统内通过灵活托拉拽的方式完成机器人话术流程编辑,将外呼语音智能机器人按照业务需求配置话术节点。

WcjEhc

阅读全文 »

什么是ReDoS

ReDoS(Regular expression Denial of Service) 正则表达式拒绝服务攻击。

开发人员使用了正则表达式来对用户输入的数据进行有效性校验, 当编写校验的正则表达式存在缺陷或者不严谨时, 攻击者可以构造特殊的字符串来大量消耗服务器的系统资源,造成服务器的服务中断或停止。

阅读全文 »

书名

《认知天性 让学习轻而易举的心理学规律》

(Make It Stick: The Science of Successful Learning)

评分 7.0

豆瓣评分7.9,但是个人评分只有7.0。
主要原因是部分地方翻译后读起来不流畅,且作者花过多例子来解释现象,有点啰嗦了。

阅读全文 »

书名

《Designing Data-Intensive Applications 数据密集型应用系统设计》

(Martin Kleppmann(著) 赵军平 吕云松 耿煜 李三平 (译))

评分 9.0

豆瓣9.6,个人9.0。绝对的好书。强推。

阅读全文 »

JPDA介绍

JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。

JPDA 主要由三个部分组成:

  1. JVMTI(Java Virtual Machine Tool Interface,Java 虚拟机工具接口)
  2. JDWP(Java Debug Wire Protocol,Java 调试线协议)
  3. JDI(Java Debug Interface,Java 调试接口)

JPDA 定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们三者之间的交互方式,即通信的接口。

这三个层次由低到高分别是 Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP)以及 Java 调试接口(JDI)。可以分别比喻为调试者(debugger)和被调试者(debuggee),以及他们中间的通信器。

被调试者:运行于我们想调试的 Java 虚拟机之上,它可以通过 JVMTI 这个标准接口,监控当前虚拟机的信息;

调试者:定义了用户可使用的调试接口,通过这些接口,用户可以对被调试虚拟机发送调试命令,同时调试者接受并显示调试结果。

调试者和被调试者之间:调试命令和调试结果,都是通过 JDWP 的通讯协议传输的。所有的命令被封装成 JDWP 命令包,通过传输层发送给被调试者,被调试者接收到 JDWP 命令包后,解析这个命令并转化为 JVMTI 的调用,在被调试者上运行。类似的,JVMTI 的运行结果,被格式化成 JDWP 数据包,发送给调试者并返回给 JDI 调用。

阅读全文 »

Java Agent技术

JVMTI (JVM Tool Interface)是Java虚拟机对外提供的Native编程接口,通过JVMTI,外部进程可以获取到运行时JVM的诸多信息,比如线程、GC等。

Agent是一个运行在目标JVM的特定程序,它的职责是负责从目标JVM中获取数据,然后将数据传递给外部进程。

Agent用来监测和协助 JVM ,甚至能够替换和修改某些类的定义。有了这样的功能,开发者就可以实现更为灵活的运行时虚拟机监控和 Java 类操作了,这样的特性实际上提供了一种虚拟机级别支持的 AOP 实现方式,使得开发者无需对 JDK 做任何升级和改动,就可以实现某些 AOP 的功能了。

常见的使用场景如下:

  1. 无侵入统计方法耗时
  2. 无侵入进行类增强
  3. 动态修改类,以临时修复线上漏洞(如log4j2的漏洞)
  4. 动态调试(如 Java-debug-tool,Arthas)
阅读全文 »

健康检查API模式

有时服务看上去正在运行,但它却无法处理请求。例如,新启动的服务实例可能尚未准备好接受请求。例如某个服务大约需要10秒钟来初始化消息和数据库适配器。

在它们准备好之前,部署基础设施将HTTP请求路由到服务实例是没有意义的。

此外,服务实例可能会失败却不自动终止。例如某个服务进程已经Hang住了。部署基础设施不应将请求路由到已失败但仍在运行的服务实例。

并且,如果服务实例无法恢复,则部署基础设施必须终止它并创建新实例。

阅读全文 »

概述

在Java技术下谈“编译期”而没有具体上下文语境的话,其实是一句很含糊的表述,因为它可能是指一个前端编译器(叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;

也可能是指Java虚拟机的即时编译器(常称JIT编译器,Just In Time Compiler)运行期把字节码转变成本地机器码的过程;

还可能是指使用静态的提前编译器(常称AOT编译器,Ahead Of Time Compiler)直接把程 序编译成与目标机器指令集相关的二进制代码的过程。

  • 前端编译器:JDK的Javac、Eclipse JDT中的增量式编译器(ECJ)
  • 即时编译器:HotSpot虚拟机的C1、C2编译器,Graal编译器。
  • 提前编译器:JDK的Jaotc、GNU Compiler for the Java(GCJ)、Excelsior JET

相当多新生的Java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖字节码或者Java虚拟机的底层改进来支持。

Java中即时编译器在运行期的优化过程,支撑了程序执行效率的不断提升;

前端编译器在编译期的优化过程,则是支撑着程序员的编码效率和语言使用者的幸福感的提高。

阅读全文 »