在这篇文章中,我们将讨论以下话题:

  • 学习 SQL 路线图
  • Kafka 会丢失消息吗?
  • 构建微服务的 9 个最佳实践
  • 学习网络安全路线图
  • JavaScript 如何工作?

Kafka 会丢失消息吗?

错误处理是构建可靠系统最重要的方面之一。

今天,我们将讨论一个重要话题:Kafka 会丢失消息吗?

许多开发人员普遍认为,Kafka 根据其设计保证不会丢失消息。然而,理解 Kafka 架构和配置的细节对于真正 grasping 它可能如何以及何时丢失消息,更重要的是,如何防止这种情况至关重要。

下图显示了消息在 Kafka 生命周期中如何丢失。

Producer

当我们调用 producer.send() 发送消息时,它不会直接发送到 broker。消息发送过程涉及两个线程和一个队列:

  1. 应用线程
  2. 记录累加器
  3. 发送者线程(I/O 线程)

我们需要为 producer 配置适当的”acks”和”retries”以确保消息发送到 broker。

Broker

Broker 集群在正常运行时不应丢失消息。然而,我们需要了解哪些极端情况可能导致消息丢失:

  1. 消息通常异步刷新到磁盘以获得更高的 I/O 吞吐量,所以如果实例在刷新发生前宕机,消息就会丢失
  2. Kafka 集群中的副本需要正确配置以持有有效的数据副本。数据同步中的确定性很重要。

Consumer

Kafka 提供不同的方式提交消息。自动提交可能在记录实际处理之前就确认处理。当消费者在处理中间宕机时,一些记录可能永远不会被处理。

一个好的实践是结合同步和异步提交,我们在处理循环中使用异步提交以获得更高的吞吐量,在异常处理中使用同步提交以确保最后一个偏移量总是被提交。

微服务 9 个最佳实践

使用微服务创建系统极其困难,除非你遵循一些强有力的原则。

在构建微服务之前你必须知道的 9 个最佳实践:

  1. 为失败设计 带有微服务的分布式系统将会失败。你必须在多个层面(如基础设施、数据库和单个服务)设计系统以容忍失败。使用断路器、舱壁或优雅降级方法来处理失败。

  2. 构建小服务 微服务不应一次做多件事。一个好的微服务设计为做好一件事。

  3. 使用轻量级协议通信 通信是分布式系统的核心。微服务必须使用轻量级协议相互通信。选项包括 REST、gRPC 或消息代理。

  4. 实现服务发现 为了相互通信,微服务需要在网络上发现彼此。使用 Consul、Eureka 或 Kubernetes Services 等工具实现服务发现。

  5. 数据所有权 在微服务中,数据应由单个服务拥有和管理。目标应该是减少服务之间的耦合,使它们能够独立演进。

  6. 使用弹性模式 实现特定的弹性模式以提高服务的可用性。示例:重试策略、缓存和速率限制。

  7. 所有层面的安全 在基于微服务的系统中,攻击面相当大。你必须在服务通信路径的每个层面实施安全。

  8. 集中式日志 日志对于发现系统中的问题很重要。有多个服务时,它们变得至关重要。

  9. 使用容器化技术 要以隔离方式部署微服务,使用容器化技术。像 Docker 和 Kubernetes 这样的工具可以帮助,因为它们旨在简化微服务的扩展和部署。

JavaScript 特性

下图显示了 JavaScript 最重要的特性。

  • 解释型语言:JavaScript 代码由浏览器或 JavaScript 引擎执行,而不是预先编译成机器语言。这使其在不同平台上高度可移植。现代引擎(如 V8)利用即时(JIT)技术将代码编译成直接可执行的机器码。

  • 函数是一等公民:在 JavaScript 中,函数被视为一等公民,意味着它们可以存储在变量中,作为参数传递给其他函数,并从函数返回。

  • 动态类型:JavaScript 是松散类型或动态语言,意味着我们不必提前声明变量的类型,类型可以在运行时改变。

  • 客户端执行:JavaScript 支持异步编程,允许操作(如读取文件、发出 HTTP 请求或查询数据库)在后台运行,并在完成时触发回调或 promise。这在 Web 开发中对于提高性能和用户体验特别有用。

  • 基于原型的 OOP:与基于类的面向对象语言不同,JavaScript 使用原型进行继承。这意味着对象可以从其他对象继承属性和方法。

  • 自动垃圾回收:JavaScript 中的垃圾回收是一种自动内存管理形式。垃圾回收的主要目标是回收程序不再使用的对象所占用的内存,这有助于防止内存泄漏并优化应用性能。

  • 与其他语言比较:与 Python 或 Java 等编程语言相比,JavaScript 很特殊,因为它是 Web 开发的主要语言。虽然 Python 以提供良好的代码可读性和多功能性而闻名,Java 以其结构和健壮性而闻名,但 JavaScript 是一种解释型语言,无需编译即可直接在浏览器上运行,强调灵活性和动态性。

  • 与 TypeScript 的关系:TypeScript 是 JavaScript 的超集,这意味着它通过向语言添加功能(最 notably 类型注解)来扩展 JavaScript。这种关系允许任何有效的 JavaScript 代码也被视为有效的 TypeScript 代码。

  • 流行 JavaScript 框架:React 以其灵活性和大量社区驱动的插件而闻名,而 Vue 则干净直观,具有高度集成和响应式功能。另一方面,Angular 为企业级 JS 开发提供了一套严格的开发规范。

本文为学习目的的个人翻译,译文仅供参考。

原文链接:EP106: How Does JavaScript Work?

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。