云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

香港服务器_金梅瓶1一5全集百度云_高性能

小七 141 0

为Freshdesk微服务选择语言

rubyonrails有一组惊人的特性,帮助Freshworks快速提供各种产品增强功能。今天,我们面临的最大挑战是扩展基于Ruby的服务并跟上指数级增长的客户群。找到一种性能良好的替代语言将继续帮助我们快速开发特性,这变得至关重要。在这一点上,当我们试图打破我们的单一代码并从中提取微服务时,我们觉得应该开始考虑不同的替代语言。要求以下是我们在选择语言时的考虑比较用例RESTful API。(最好有从Swagger规范生成服务器代码的选项)使用来自Kafka、SQS等队列/流的消息使用以下资源MySQL数据库大量消费和生产来自/发送给卡夫卡的信息从生产和使用SQS雷迪斯发电机B调用其他内部和外部restfulapi。最好选择从Swagger规范生成客户端代码。其他AWS服务的SDK性能RESTful API服务的延迟流用户吞吐量内存占用德沃普斯监控码头化开发人员生产力语言特点可用的人才库和可培训性集成电路设备格式化静态代码分析器现有代码的可读性和可维护性代码测试周期经过初步考虑,Golang和Java是最后两个竞争者。Go和Java的比较比较用例RESTful API服务器Java和Go都有开发restfulapi的良好支持平台。swagger codegen项目和其他一些工具可以为Java和Go生成服务器存根。Java中的restapi库主要使用注释来配置API的各个方面,比如方法所服务的端点、请求/响应格式等等。另一方面,Go库使用显式代码来指定路由。因此,Go在设置端点时需要更多的代码。但是,可以说,对于新开发人员来说,在一个地方进行HTTP路由比让每个类定义其负责的路径要容易得多。类似地,可以使用注解来验证Java中的请求,而Go则需要手动编码。考虑到我们很可能从Swagger spec生成服务器存根,所有这些代码将在这两种情况下自动生成。因此,考虑这个用例将给您带来最小的影响。不过,Java中成熟的库在这里还是有一点优势的。使用来自Kafka、SQS等队列/流的消息Java和Go都有许多库可以从每个流行的队列/流实现中使用。考虑到Java已经存在很长时间了,它有很多可用于并发编程的选项。由于线程的可用性是核心,有许多实用程序可用于管理线程、跨线程分配工作、非常灵活的同步选项等等。使用这些可以构建非常复杂的解决方案。然而,考虑到这些库/实用程序带来的复杂性,许多应用程序很容易受到争用和/或争用条件的影响。此外,还需要大量时间来理解和有效地应用各种可用的选项。通常,同步和并发编程是Java候选人面试时最麻烦的领域之一。考虑到线程的复杂性,并考虑到线程相当昂贵,大多数程序员选择在单个线程中编写运行的大块逻辑,除非绝对必要。另一方面,Golang有一个非常简单的基于goroutines(轻量级线程)和channels(阻塞队列)的并发模型。虽然Go标准库支持互斥,但在大多数情况下,使用goroutines和channels是Go中编程的惯用方式。这个模型非常简单和高效,我希望程序员能够更频繁地使用它们,并生成由goroutines执行的许多小块工作组成的应用程序。这也将确保结果更具可预测性和更少的缺陷。虽然类似的模型可以用Java构建,但很少使用。因此,Go在这一领域远远超过Java。使用数据存储/其他restapi这两种语言都有大量的库集合,用于与所有流行的数据存储进行交互。通常,Java库试图用自定义接口隐藏底层实现的细节。例如,JPA定义了自己的查询语言,通过对象字段公开关联,而Go库通常是底层系统上的简单包装器。这意味着开发人员需要了解底层系统的细节(例如SQL)。这是非常值得商榷的。一方面,Java库可以通过复杂的接口隐藏复杂性(JPA中的关联是简单对象的字段访问)。然而,如果必须改变库的行为(比如说,让JPA支持MySQL分片),那么与库抗争可能是一场痛苦的考验。类似地,如果某些东西没有按我们预期的方式工作,调试可能会非常困难。而且,学习曲线可能更陡峭。考虑到Java的生命周期较长,Java库通常有更好的文档记录。由于Go库非常简单,所以浏览代码并理解所发生的事情非常简单。在某些情况下,这可能是首选。我们使用的许多服务(Kafka和所有awsdk)的Client/SDK首先是用Java实现的,Go库随后发布。这种考虑是非常主观的,取决于个人喜好。性能由于JVM已经存在了20多年,它经历了许多调整,反过来又为我们提供了惊人的性能。它也给了我们很多选择。例如,我们可以选择一个针对实时、低延迟工作负载进行调优的垃圾收集器;另一个针对后台的高吞吐量工作负载;另一个针对低功耗、单核服务器;等等。它们大多使用分代内存布局,这对于大多数用例来说都是非常有效的。几乎所有东西(每一代的大小、预期的暂停、最大/最小内存等)都可以通过各种旋钮进行配置,具体取决于所使用的垃圾收集器。尽管基本设置提供了不错的性能,但是从JVM中获取每一盎司的能量可能是一个令人望而生畏的过程。另一方面,Go有一个单独的垃圾收集器算法,该算法针对非常低的延迟(GC暂停以微秒为单位)进行了高度优化。如果我们看看我们自己的基于Go的实时通知服务器,它每天处理数百万条消息,在第95个百分位,端到端延迟大约为5毫秒。考虑到每个消息在4个服务之间进行持久化,这一点令人印象深刻。当然,这不是一个银弹,有它自己的成本。随着Go越来越成熟,我们可以期待更好的收集器被实现以满足其他用例。Go团队已经在开发一种新的收集器,称为面向请求的收集器,它针对类似web服务器的工作负载进行了优化。一般来说,Go的内存占用要比Java小得多。在我们基于Go的实时通知服务器中,有些服务在生产中每个进程大约有70mb内存。使用Java,几乎没有任何东西可以运行少于512MB的内存。docker允许在同一台机器上运行多个服务,这一点尤其有益。在不同的头部基准上获得相同的吞吐量。随着时间的推移,围棋似乎获得了更多的市场份额,随着它的成熟,它可能会向有利于它的方向倾斜。德沃普斯Java已经非常成熟,并且有许多用于监视的库和工具。我们也有足够的内部曝光。NewRelic为监视应用程序的各个方面(如HTTP请求和DB查询)提供了强大的支持。NewRelic还支持Go,它包括HTTP请求和DB查询。然而,由于it框架的支持还很不全面,所以目前还不清楚这些框架是如何被覆盖的。Go有一些库,可以向许多可用的监控系统(如StatsD、InfluxDB等)发送标准Go运行时度量。对于不支持NewRelic的数据存储的客户机,其中一些已经与这些度量库集成,并且可以很容易地使用。如果它们不可用,我们可能必须实现我们自己的度量收集器,它将把必要的信息传递给度量库。两个应用程序的对接非常简单。然而,Java在这方面有着明显的优势。开发人员生产力语言特点围棋的作者在限制语言的特性和保持语言的语法非常简单方面是非常慎重的。这意味着Go语法及其核心概念可以很快学会。最近,Java增加了大量的特性、语法糖、并发库等等。因此,学习语言的复杂性增加了。如前所述,了解实现并发处理权的所有本质需要大量的努力。除此之外,其他大部分都是事实上的框架,比如Spring、Hibernate、SpringMVC/Jersey、Jetty/Tomcat,这些都让学习花了很长时间。另一方面,一旦学习了这些框架/库/特性,它们可以极大地提高生产率,因为它们处理了下面的许多复杂性。可以说,GO中缺少的最大特性是泛型(C++中的模板)。因此,许多实用功能(例如,数组。包含())需要为每种类型重复实现。考虑到Go鼓励为几乎所有东西定义新类型(例如,AccountID,可能只是一个整数,可以是一个新类型),这些实用函数必须重复太多次。Go也有代码生成功能