pmp 提升绩效的工具
微服务是目前一个热门词汇。 它是真的是原创的还是建立在最佳实践的基础上的? 微服务的实现方式存在一些缺点,但是可以解决吗?
组件可测试性和一致性
一旦组装了一个大型系统,就很难甚至不可能确定最大延迟来自何处。 您可以分析平均延迟或吞吐量 ,但是要获得一致的延迟,您需要分析系统的关键部分。 在这里,具有独立运行的简单组件并可以作为独立组件进行测试,可以帮助您实现系统端到端需求的一致性。
UNIX哲学
微服务的许多关键概念已经在分布式系统中使用了很多年。
微服务与Unix哲学有很多共同点
引用Mike Gancarz总结的这些原则如下:
- 小就是美丽。
- 使每个程序做好一件事。
- 尽快建立原型。
- 选择便携性而不是效率。
- 将数据存储在纯文本文件中。
- 利用软件优势发挥自己的优势。
- 使用Shell脚本可提高杠杆作用和可移植性。
- 避免限制用户界面。
- 使每个程序成为过滤器。
微服务体系结构是应用于分布式系统的UNIX哲学。 微服务架构的哲学从本质上等同于Unix的哲学“做一件事情,做好一件事情”。 描述如下:
- 这些服务很小-细粒度执行单个功能。
- 组织文化应包含自动化的部署和测试。 这减轻了管理和运营的负担。
- 文化和设计原则应包含失败和错误,类似于抗脆弱系统。
- 每个服务都是弹性的,有弹性的,可组合的,最少的和完整的。
使用微服务架构存在一些缺点 ,例如:
- 服务构成信息障碍 。
- 该架构引入了额外的复杂性和要处理的新问题,例如网络延迟, 消息格式 , 负载平衡和容错能力 。 忽略其中之一属于“分布式计算的谬误”。
- 测试和部署更加复杂。
- 整体应用程序的复杂性仅转移到网络中,但仍然存在。
- 细粒度的微服务已被批评为一种反模式。
我们能否获得整体和微服务的最佳功能? 一定要一个或另一个吗? 我们是否应该使用最适合我们问题的方法。 微服务的关键方面之一是应用程序的受控部署。 在这种情况下,我们不应该能够在最有意义的地方将组件部署为Monolith或微服务。
提议的纳米服务替代方案包括;
- 将功能打包为库而不是服务。
- 将功能与其他功能结合在一起,可以提供更实质,更有用的服务。
- 重构系统,将功能置于其他服务中或重新设计系统。
我们如何才能做到两全其美?
确保您的组件是可组合的。
如果您的组件是可组合的,则它们始终是正确的大小。 您可以根据需要将它们组合为一组服务,也可以将所有内容组合为一项服务。
这对于测试和调试尤其重要。 您需要知道一组业务组件可以一起工作,而不会妨碍基础结构(例如中间件)。 为了进行单元测试,您可能希望在一个线程中运行所有组件,而一个则直接调用另一个。 这不会比测试整体组件的复杂程度更高,在该组件中,您可以将代码从一个组件逐步转移到另一个组件,并准确查看正在发生的事情。
仅当组件在没有基础结构的情况下可以正常正常工作时,才需要测试它们在基础结构下的行为。
使基础架构与应用程序需求一样快。
低延迟交易系统是分布式系统,但是它们也有非常严格的延迟要求。 大多数交易系统旨在以比您看到的更快的速度处理延迟。 在Java领域中,看到一个交易系统的延迟必须低于100微秒,这是99%的时间,甚至是99.9%的时间,这种情况并不罕见。 这可以通过使用高级语言(如Java)中的商品硬件来实现。
实现低延迟的关键是;
- 用于消息传递和日志记录的低延迟基础结构。 对于短消息,理想情况下约为1微秒,
- 最少的网络跳数
- 实际生产负荷的高可复制性,因此您可以研究99%tile(最差1%)或99.9%tile(最差0.1%)的延迟,
- 将每个CPU内核视为具有特定任务/服务,以及其自己的CPU缓存数据和代码。 重点是在内核之间(而不是计算机之间)分配应用程序。
L2缓存一致性总线是高性能服务之间的消息传递层。
您可以在两个不同内核之间对相同数据执行CAS操作。 在这里,每个线程在Sandy Bridge处理器上以小于50纳秒的往返时间切换另一个线程设置的值,而在新一代处理器上则更少。
Java中低延迟结构的示例包括:
这些传输在处理负载平衡和故障转移方面具有不同的优势。
使消息格式成为配置注意事项。
消息格式中存在许多相互竞争的问题。 你要;
- 具有人类可读性,因此您可以验证消息不仅行为正确,而且可以按照您期望的方式进行。 通过转储存储文件或消息日志,我经常感到惊讶,发现了多少个问题。
- 机器友好的二进制格式,可提高速度。
- 未来架构更改方面的灵活性。 灵活性意味着增加冗余,以便该软件可以应对将来添加/删除字段并更改其数据类型的需求。 如果您不需要此冗余,那将是浪费。
理想情况下,您可以在测试/部署时选择最佳选项。
序列化库的一些示例,您可以在其中更改实际的线路格式以适合您的需求:
- Jackson Speaming API –支持JSON,XML,CSV,CBOR(二进制格式),
- 编年史线 –支持对象序列化YAML,多种不同形式的Binary YAML,JSON,CSV和Raw数据。
我发现在YAML和 JSON中有用的是更清晰的语法,该语法设计为易于阅读,而不是另一种语言的子集,它自然支持数据类型,注释,二进制内容和消息分隔符。
结论
我认为关于如何使用微服务有很多好的想法,而且我认为围绕微服务的许多批评都基于微服务的实现方式,并且我认为它们可以解决。
翻译自: https://www.javacodegeeks.com/2017/02/micro-services-performance-2.html
pmp 提升绩效的工具