微服务提升绩效

总览

目前,微服务是一个时髦的词。 它是真的是原创的还是建立在最佳实践的基础上。 微服务的实现方式存在一些缺点,但是可以解决吗?

组件可测试性和一致性

一旦组装了一个大型系统,就很难甚至不可能分析出最大的延迟来自何处。 您可以分析平均延迟或吞吐量,但是要获得一致的延迟,您需要分析系统的关键部分。 在这里,具有独立运行并经过单独测试的简单组件可以帮助您实现系统端到端需求的一致性。

UNIX哲学

微服务的许多关键概念已在分布式系统中使用了很多年。

微服务与Unix哲学有很多共同点

引用Mike Gancarz总结的这些原则如下:

  • 小就是美丽。
  • 使每个程序都做好一件事。
  • 尽快建立原型。
  • 选择便携性而不是效率。
  • 将数据存储在纯文本文件中。
  • 利用软件优势发挥自己的优势。
  • 使用Shell脚本来增加杠杆作用和可移植性。
  • 避免限制用户界面。
  • 使每个程序成为过滤器。

微服务体系结构是应用于分布式系统的UNIX哲学。

微服务体系结构的哲学从本质上等同于Unix的哲学“做一件事情,做好一件事情”。 描述如下:

  • 这些服务很小-细粒度执行单个功能。
  • 组织文化应包含自动化的部署和测试。 这减轻了管理和运营的负担。
  • 文化和设计原则应包含故障和错误,类似于抗脆弱系统。
  • 每个服务都是弹性的,有弹性的,可组合的,最小的和完整的。

使用微服务架构有一些缺点 ,其中一些是

  • 服务形成信息障碍
  • 该架构引入了额外的复杂性和新问题,例如网络等待时间,消息格式,负载平衡和容错等。[15]忽略其中之一属于“分布式计算的谬误”
  • 测试和部署更加复杂
  • 整体应用程序的复杂性仅转移到网络中,但仍然存在。
  • 细粒度的微服务已被批评为一种反模式

我们能否获得整体和微服务的最佳功能? 一定要一个或另一个吗? 我们是否应该使用最适合我们问题的方法。 微服务的关键方面之一是应用程序的受控部署。 在这种情况下,我们不应该能够在最有意义的地方将组件部署为Monolith或微服务。

提议的纳米服务替代方案包括:[21]

  • 将功能打包为库而不是服务。
  • 将该功能与其他功能结合在一起,可以提供更实质,更有用的服务。
  • 重构系统,将功能置于其他服务中或重新设计系统。

我们如何才能做到两全其美?

使组件可组合

如果您的组件是可组合的,则它们始终是正确的尺寸。 您可以根据需要将它们组合为一组服务,也可以将所有内容组合为一项服务。

这对于测试和调试特别重要。 您需要知道一组组件可以一起工作,而不会妨碍基础架构。 出于单元测试的目的,您可能希望在一个线程中运行所有组件,而一个则直接调用另一个。 这仅比测试整体组件的复杂程度更高,在该组件中,您可以将代码从一个组件逐步转移到另一个组件,并准确查看正在发生的情况。

仅当您的组件在没有基础结构的情况下可以正常正常工作时,才需要测试它们在基础结构下的行为。

使基础架构与应用程序需求一样快。

低延迟交易系统是分布式系统,但是它们也有非常严格的延迟要求。 大多数交易系统旨在以比您看到的更快的速度处理延迟。 在Java领域,看到一个交易系统需要在99%的时间甚至99.9%的时间内将延迟低于100微秒的情况并不少见。 这可以通过使用高级语言(如Java)中的商品硬件来实现。

实现低延迟的关键是

  • 用于消息传递和日志记录的低延迟基础结构。 对于短消息,理想情况下约为1微秒。
  • 最少的网络跳数。
  • 实际生产负载的高再现能力,因此您可以研究99%tile(最差1%)或99.9%tile(最差0.1%)的延迟。
  • 将每个CPU内核视为具有特定任务/服务,以及其自己的CPU缓存数据和代码。 重点是在内核之间(而不是计算机之间)分配应用程序

L2缓存一致性总线是高性能服务之间的消息传递层。

微服务提升绩效_第1张图片

您可以对两个不同内核之间的相同数据执行CAS操作,其中每个线程在Sandy Bridge处理器上以小于50纳秒的往返时间来切换另一个线程设置的值,而在新世代上则更少。

Java中低延迟结构的示例包括

  • Aeron可靠的UDP传输
  • 编年史队列用于消息传递和日志记录的持久队列。

这些传输在处理负载平衡和故障转移方面具有不同的优势。

使消息格式成为配置注意事项。

消息格式中存在许多相互竞争的问题。 你要

  • 具有人类可读性,因此您可以验证消息不仅行为正确,而且可以按照您期望的方式进行。 通过转储存储文件或消息日志,我经常感到惊讶,发现了多少个问题。
  • 机器友好的二进制格式,可提高速度。
  • 未来架构更改方面的灵活性。 灵活性意味着增加冗余,以便软件将来可以应对增加/删除字段以及更改其数据类型的需求。 如果您不需要此冗余,那将是浪费。

理想情况下,您可以在测试/部署时选择最佳选项。

序列化库的一些示例,您可以在其中更改实际的线路格式以适合您的需求。

  • Jackson Speaming API ,支持JSON,XML,CSV,CBOR(二进制格式)
  • Chronicle Wire支持对象序列化YAML,多种不同形式的Binary YAML,JSON,CSV,Raw数据。

我发现在YAML和 JSON中有用的是更清晰的语法,该语法设计为易于阅读,而不是另一种语言的子集,它自然支持数据类型,注释,二进制内容和消息分隔符

结论

我认为关于如何使用微服务有很多好的想法,并且我认为围绕它们的许多批评都基于它们的实现方式,并且我认为它们可以解决。

翻译自: https://www.javacodegeeks.com/2016/03/micro-services-performance.html

你可能感兴趣的:(python,java,大数据,数据库,linux)