在这篇文章中,我们将讨论以下话题:
- 学习 SQL 路线图
- Kafka 会丢失消息吗?
- 构建微服务的 9 个最佳实践
- 学习网络安全路线图
- JavaScript 如何工作?
Kafka 会丢失消息吗?
错误处理是构建可靠系统最重要的方面之一。
今天,我们将讨论一个重要话题:Kafka 会丢失消息吗?
许多开发人员普遍认为,Kafka 根据其设计保证不会丢失消息。然而,理解 Kafka 架构和配置的细节对于真正 grasping 它可能如何以及何时丢失消息,更重要的是,如何防止这种情况至关重要。
下图显示了消息在 Kafka 生命周期中如何丢失。
Producer
当我们调用 producer.send() 发送消息时,它不会直接发送到 broker。消息发送过程涉及两个线程和一个队列:
- 应用线程
- 记录累加器
- 发送者线程(I/O 线程)
我们需要为 producer 配置适当的”acks”和”retries”以确保消息发送到 broker。
Broker
Broker 集群在正常运行时不应丢失消息。然而,我们需要了解哪些极端情况可能导致消息丢失:
- 消息通常异步刷新到磁盘以获得更高的 I/O 吞吐量,所以如果实例在刷新发生前宕机,消息就会丢失
- Kafka 集群中的副本需要正确配置以持有有效的数据副本。数据同步中的确定性很重要。
Consumer
Kafka 提供不同的方式提交消息。自动提交可能在记录实际处理之前就确认处理。当消费者在处理中间宕机时,一些记录可能永远不会被处理。
一个好的实践是结合同步和异步提交,我们在处理循环中使用异步提交以获得更高的吞吐量,在异常处理中使用同步提交以确保最后一个偏移量总是被提交。
微服务 9 个最佳实践
使用微服务创建系统极其困难,除非你遵循一些强有力的原则。
在构建微服务之前你必须知道的 9 个最佳实践:
为失败设计 带有微服务的分布式系统将会失败。你必须在多个层面(如基础设施、数据库和单个服务)设计系统以容忍失败。使用断路器、舱壁或优雅降级方法来处理失败。
构建小服务 微服务不应一次做多件事。一个好的微服务设计为做好一件事。
使用轻量级协议通信 通信是分布式系统的核心。微服务必须使用轻量级协议相互通信。选项包括 REST、gRPC 或消息代理。
实现服务发现 为了相互通信,微服务需要在网络上发现彼此。使用 Consul、Eureka 或 Kubernetes Services 等工具实现服务发现。
数据所有权 在微服务中,数据应由单个服务拥有和管理。目标应该是减少服务之间的耦合,使它们能够独立演进。
使用弹性模式 实现特定的弹性模式以提高服务的可用性。示例:重试策略、缓存和速率限制。
所有层面的安全 在基于微服务的系统中,攻击面相当大。你必须在服务通信路径的每个层面实施安全。
集中式日志 日志对于发现系统中的问题很重要。有多个服务时,它们变得至关重要。
使用容器化技术 要以隔离方式部署微服务,使用容器化技术。像 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?。
版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。