Grigory Petrov:在Ruby中使用网络

在9月28日的Evrone RubyRussia DevRel会议上, Grigory Petrov将讨论微服务如何通信。 在今天的采访中, 伊万·索洛维约夫Ivan Solovyov)与格里高利 (Grigory)谈论了他即将发表的演讲的主题,而不仅限于此。

图片

告诉我们您的情况,您在Evrone做什么?

我参与了开发者关系-这是DevRel与技术传播者之间的交流,该传播者可以在会议上发表演讲。 像Robin Hood一样工作:与公司内的开发团队进行沟通,从他们的工作中收集各种有趣的东西,并在会议上讨论它。 红宝石俄罗斯将是我将代表公司参加的首批会议之一。

我知道您是各种Python会议的组织者之一。 告诉我您是如何来到Ruby世界的?

我从未离开过Ruby世界。 我的第一批讲座之一是Python vs Ruby。 许多年前,当我用C ++编写时,我需要用于任何测试和文档生成的高级自动化机制。 然后,我用Python和Ruby编写了代码,然后用PHP编写了一些代码。 我一直在寻找解决我所遇到问题的最佳方法。

您的报告将从公司内的开发团队借来多少? 我知道您使用多种语言编写:不仅是Ruby,Python,PHP,TypeScript,JavaScript,C ++。

该报告将涉及微服务之间通过网络的通信,用于此目的的协议以及新出现的困难。 实际上,我与网格有很长的关系。 我做了Radmin,这是一个用于远程控制的网络工具。 NPTV项目(我也曾在DevRel工作过)是一个交互式电视,它主动使用网格并在Ruby上进行控制。 Voximplant(我再次学习DevRel的地方)是我遇到VoIP的可编程电话。 网格离我很近。 我可以根据自己的经验进行报告,但是这样一来,我不会给会议嘉宾带来最大的价值,但我想从中受益最大。 在最初准备报告期间,我采访了几个Evrone团队。 该公司从事复杂和高质量软件的定制开发,许多团队正在从事各种项目。 我们打电话给Zoom并聊了一个小时或更长时间。 他们讨论了做什么以及如何做,遇到了什么困难,使用了什么堆栈。 我的报告将涉及网格,网络协议,复杂性和应用程序,一半涉及不同团队在Ruby中的使用方式。

您与开发人员进行了很多交流。 您认为在Ruby中使用网络的具体程度如何?

网络由几个部分组成。 首先,编程语言及其生态系统的工作直接通过网络传输字节。 最低级别的网络堆栈。 例如,相同的JS和Node使用libuv (一个异步模型)。 有一个主流,您最终将与网络合作。 您对此有协程。 您有很多期望,为了接收数据而等待,您等待以使数据被发送。 这个单线程每秒提供成千上万的查询。

在此基础上开发框架,无论框架如何。 例如,JS没有使用网格的严肃框架(对此您可以表示祝贺!)。 除了express.js,这几乎不是一个完整的框架。 Python切换到了类似的模型,而最受欢迎的Django框架仍保留在先前的模型上。 现在有种矛盾:一个同步框架正试图通过阻塞线程来传播,一个GIL悬于其上的进程,另一方面是一些尝试在异步模型上工作的新事物,例如Django Channels。 Ruby仍处于同步模型中,并由进程传播。 因此,这是Rails的相应生态系统,方法和非常牢固的位置。

Ruby的力量是什么? 首先,在DSL中,特定于域的语言。 当我们谈论网格时,Ruby在最强大的领域发挥最好的作用。 当我们使用GraphQL时,这意味着使用GraphQL的库无处不在。 在Ruby中,他们将使用非常好的DSL语法来定义模式。 并且这些DSL语法和ActiveRecord中的DSL ORM语法之间的集成。 这正是我们对Ruby的期望。 同时,我们将没有任何异步操作(等待),我们将按流程进行扩展,并拥有相应的服务器要求。

您的报告陈述了几种交互协议。 相同的JSON:API等。 您如何看待进一步的发展,我们都将滑入GraphQL吗?

一个非常共鸣的问题。 我认为,这始于网格速度缓慢的事实。 开始时的应用程序很简单。 通常,所有应用程序(包括Ruby,Python和Node)都使用常规HTTP端点进行通信。 在内部,他们使用某种有效载荷。 以前是XML,现在是JSON。 在最初的几个月或几年中,他们表现不错,就好像他们很幸运。 接下来,企业开始提出复杂的问题。 例如,您需要获得一些用户,并且每个用户都需要获得他所从事的公司的列表。 这里出现了问题:如果仅使用端点,则将是数十个或数百个请求,并且网格很闲:请求,响应,丢失的数据包。 这将非常慢,并且需要通过网络传输大量数据。 比所需数据多100倍。 我们的系统崩溃了,因为大型商业自动化系统在这种要求下崩溃了,在十年之内变成了怪兽,几分钟,几小时可能是界面上的一个复杂问题。 一直以来,后端的数据库都会计算出一堆相同的请求,并且一堆相同的请求将遍历整个网络。 我们尝试以不同的方式解决它。

给出此类问题的真实例子吗?

Facebook特别杰出,他们遇到的问题非常严重:他们喜欢对很多数据进行复杂的查询。 例如:给我看那些评论此帖子的人和他们的朋友。 为了不发出数百万个请求,Facebook使用了不同的选项。 例如FQL,Facebook查询语言。 收集了他们所有的专业知识后,他们制作了GraphQL-使您可以在客户端上进行类似SQL的查询的事情。 但这不是SQL,因为我们不能附加到数据库,而是使用后端API的查询。 您发送一个请求,就会得到一个(或如何)答复。

第二个大问题是如果我们想从后端获取大量数据该怎么办。 例如,五千个用户或登录10mb。 只需一个http请求响应就可以完成所有操作。 因为如果网格崩溃,则将必须重复整个请求,并且此请求将永远持续下去。 回到Facebook:他们制作了GraphQL,这是网格上的拐杖。 然后其他人执行了HTTP / 2,从而解决了网格问题。 HTTP / 2建立一个异步连接,在其中我们可以发出许多小请求。 如果GraphQL服务器没有太多魔术来优化后端数据库查询的数量,则HTTP / 2将与GraphQL对抗。 在演讲中,我们将讨论Ruby为这种魔术提供的功能。 使用HTTP / 2,可能不需要GraphQL。 我们可以向端点发出100个HTTP / 2请求,从字节的角度来看,这不会比使用GraphQL更大的开销。 Google协议缓冲区和gRPC从第三端开始解决此问题。 他们使用二进制传输协议,主要是HTTP / 2,它们为api提供了某种方案。 在这里,它们与通常的REST竞争。

实际上,在大多数使用JSON的公司中,程序员Vasya坐着并用手编写此JSON。 六个月后,Vasya得知可以用一百种不同的方式传输日期和时间。 恐怖开始! 但是,如果优秀的开发人员坐在公司中,他们不仅会编写JSON,而且会使用某种标准。 使用OpenAPI或JSON Schema,所有与gRPC竞争的有趣的事物。 整个现代动物园解决了一些有人提出的问题。 我完全无法预测这个动物园将来会发生什么。 但是,我邀请开发人员来讨论这个问题:来年3、5、10等待着我们什么,现在的力量配置是什么。

让我们谈谈Ruby作为编程语言的未来吗?

很难预测未来。 我真的很想在Ruby中看到好的类型。 Ruby 3现在处于类型实现的初始阶段。 我希望这种语法漂亮。 我看到了这些建议,我的秃头站在这些建议的尽头。 可怕,非常冗长的语法,没人会使用。

你为什么这么认为?

我是一名业余神经生理学家。 每个人都有的直觉思维喜欢做出各种奇怪的决定。 例如,如果您需要写很多字母,那么这很不好。 这些类型可能非常酷,但是由于您必须编写多一倍半的代码,因此我们会感到“我不想”。 而且我们对自己的情绪非常敏感,因此没有人会使用它。 我真的很喜欢通过冒号在Python和TypeScript中传达类型的方式。 这样可以减少开销。 我们写了一个标识符-看了。 我知道肯定会有一个数字,您需要设置一个陷阱。 开发人员编写一个冒号,就是这样,陷阱已安装。 几周后,当他不小心将列表或行传递到那里时,陷阱将起作用并为开发人员节省数小时或数周的调试时间。

您还想在Ruby中看到什么?

在过去的几年中,我看到了很多与协程无关的信息。 我真的很喜欢这样做,因为带有协程的异步代码很容易阅读。 这是可以理解的,它允许您将复杂的内容塞入简单的语法中。 这在最新的Python中实现良好,在JavaScript中实现良好。 我真的很想让Ruby带来类似的东西……实际上,Ruby具有纤维。 添加Node之类的东西很酷,以便您可以使用光纤或其他一些原语编写异步Ruby应用程序。 而且在幕后,它本身将使用libuv或其他一些操作系统原语与网格一起工作。

否则它将在流中布置一些东西。 将使用某种方式来竞争性地满足所有这些网络请求,数据库请求,文件系统请求。 而且我只会在对传入请求或计时器执行的一小段代码的级别上编写协程,然后发出命令并等待其执行。 更进一步的说,所有这些都是并行完成的,所有亚马逊汽车都被100%吞噬,每秒有成千上万的请求。 就Go而言,每秒数十万个查询。

返回类型。 这可能是渐进类型的输入,渐进打字?

渐进式打字是一种巨大的飞速增长,它最初被添加到Python中。 我们做到了,以便可以添加一些类型。 我认为,当开始时就非常快速地编写没有类型的代码,然后当开发人员看到代码的某些部分稳定下来时,类型就开始添加到这部分代码中,从而形成了整个开发范例。 它已在这里稳定下来,有必要设置陷阱,以便将来不会破坏这个稳定的陷阱。 如果他们为Ruby做过类似的事情,那将很酷。

您想在会议上问什么问题?

我学习日语已有四年了,我的日语可能足以对他说“谢谢”。 我会训练!

RubyRussia见!

注册 ,下一次提价预计在9月15日之后,将有700位参与者。

还要感谢支持我们的公司:

主办单位-Evrone
一般合伙人-Toptal
金牌合作伙伴-Gett
银牌合作伙伴-JetBrainsBookmateCashwagon
铜牌合作伙伴-InSales

Source: https://habr.com/ru/post/zh-CN467029/


All Articles