Apache Thrift 是不是允许任何两种语言之间的外部函数调用?

Posted

技术标签:

【中文标题】Apache Thrift 是不是允许任何两种语言之间的外部函数调用?【英文标题】:Does Apache Thrift allow foreign function calls between any two languages?Apache Thrift 是否允许任何两种语言之间的外部函数调用? 【发布时间】:2012-10-15 00:37:49 【问题描述】:

我目前正在尝试开发可以从(各种其他编程语言)访问的(多种编程语言的 API)。我查看了 Apache Thrift,似乎可以使用 Thrift 在任何两种语言之间进行无缝的外部函数调用。这是正确的吗?

【问题讨论】:

为清楚起见添加了上面的括号(以解决第一句话的混淆语义。) 另外,我有兴趣学习如何使用 Apache Thrift 调用外部函数(从一种 Thrift 支持的语言到另一种 Thrift 支持的语言。) 【参考方案1】:

创建 Thrift 是为了促进不同进程之间通过网络进行通信,而不是在进程 FFI 中。可能有可能采用 Thrift 的某些部分(如 IDL),并将其用于 FFI,但这可能是一项艰巨的任务,并提供次优结果。

【讨论】:

那么,还有其他更适合跨语言FFI的软件框架吗? 另外,我不完全理解 RPC(远程过程调用)和 FFI 之间的区别。主要区别是什么? RPC 调用另一个进程中的函数,通常在不同的机器上。为此,在调用方或参数被序列化为字节流,然后该字节流通过网络或其他一些进程间通信传输到函数的实现者。他反过来反序列化接收到的字节流,并创建在实现函数的进程中调用函数所需的所有数据结构,然后调用函数。当函数返回值但在其他方向时,类似的过程会继续。这就是节俭的作用。 另一方面,在 FFI 中,调用者和函数都存在于同一个进程中,所有序列化/反序列化都不是必需的,也不会发生。如果语言不同,可能会有一些参数按摩,但仍然比 RPC 序列化/反序列化简单得多。 这当然是一件小事。您只使用序列化部分,不需要 RPC 部分。【参考方案2】:

实际上,我自己也一直在考虑类似的事情。

Thrift 规范有一些核心概念。

传输:这部分负责促进客户端和服务器之间的数据传输。 协议:这部分负责以不同方式格式化所述数据。它可以是 JSON、压缩二进制文件,甚至是未压缩的原始二进制文件。 服务器:负责将这些东西放在一起并管理它们。

Thrift 允许您以独特的方式混合这些不同的部分,以创建适合您目的的东西。虽然 Thrift 仍然非常面向服务器客户端。

在 thrift 中开发 API 意味着理论上您可以拥有任何语言的插件。主软件组件将启动子流程并使用 STD-IN/OUT 作为传输。这将允许它进行 RPC 调用而不管语言。

【讨论】:

以上是关于Apache Thrift 是不是允许任何两种语言之间的外部函数调用?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache Thrift 的 Java 编译错误

Java分布式RPC通信框架Apache Thrift 使用总结

thrift总结

Apache Thrift系列详解- 概述与入门

Apache Thrift 的使用

Apache Thrift 和 ZeroMQ 的区别