最近在思考一个问题,就是两种或者多种编程语言之间有哪些通信方式,以及他们的适合领域是哪些呢?
我自己能想到的(但是并不一定对)有:
但是,最近还在网上看到了 rpc 通信方式,由于没有经验,对这方面不是很懂,希望这方面经验大大可以指教一下。
1
peter999 2016-06-03 19:32:33 +08:00
json, protobuf 类似的很多
|
2
am241 2016-06-03 19:34:35 +08:00
动态链接库, swig , ctypes , jni
共享内存 /文件 管道 消息 COM/ActiveX socket RPC/DBUS XML/JSON API |
4
Mutoo 2016-06-03 19:47:12 +08:00
游戏开发就很常见呀,脚本语言跟宿主语言通过共享内存通信:比如 c++/lua 以及 c/python
另外还有客户端(c++) 跟服务端(erlang) 通过 socket + protobuf 协议通信 |
7
dphdjy 2016-06-03 20:33:47 +08:00 via Android 12
楼上们说着就变成数据交互格式了,虽然我也是小白
JSON/XML/protobuf/flatbuf/Parcel 都是对传输数据的封装并不是方式!!! 这个问题在不同平台和环境答案都不一样 1 两种语言的关系 2 是否同一进程 3 是否在同一设备 等 比如 Lua 和 C 通讯,因为 Lua 的解释器是 C 编写的,所以可以直接在解释层处理 而 Java 和 Lua ,需要通过 C 在中间转换对象 同一设备可以通过系统内的资源进行处理 比如共享内存 /共享文件 /管道 跨设备无法直接共享资源 就要 TCP 然后,因为通过网络协议封装好,适应性广泛,所以常用这种,但是这种相对于上面的性能有所损耗,但是一般也无需在意,然后 TCP 传输二进制流,流本身读取需要写结构体,各种拆包,于是出现类似 JSON/XML 这类字符串组成的文本协议,后来因为效率问题,出现 protobuf 之类的有通用结构的二进制协议 RPC 是远程调用,也是约定协议,远程执行一些需求,是上述的具体实现加以封装 同 RPC 上面一大堆乱七八糟的名词也基本都是具体封装 不过有些是平台提供的 比如 Android 的远程服务,通过内核处理的原生封装 Windows 的 Com/ActiveX (大概 如有错误,欢迎楼下指正 就酱~ |
8
markocen 2016-06-03 21:17:04 +08:00
Rabitmq, Redis
|
9
alexapollo 2016-06-03 21:23:37 +08:00
IPC, RPC => socket, pipe, file, 信号量, 共享内存
以上,左为概念,右为具体形式 |
10
444683462 2016-06-03 21:40:44 +08:00
json
|
11
yxzblue 2016-06-03 22:50:11 +08:00
Thrift
|
12
billlee 2016-06-03 22:52:53 +08:00
1. 同进程: C API
2. 不同进程: 2.1 管道 2.2 socket: unix domain socket, TCP/IP 2.3 消息队列: POSIX mq, redis, RabitMQ, dbus 2.4 HTTP API: RESTful, JSON-RPC 2.5 Signal 至于共享内存什么的,不同编程语言很难用到一起吧 |
13
SoloCompany 2016-06-04 01:42:55 +08:00
不同进程但同主机下的通信,其实还有一种比较常用的原始方式,就是文件交换
也可以算是消息队列的一种吧 |
14
edsgerlin 2016-06-04 01:51:18 +08:00 1
CORBA 这种老古董,果然已经没人提了吗?
|
15
JamesRuan 2016-06-04 03:07:18 +08:00
这个可以做为面试题目了。
|
16
ayaseangle 2016-06-04 03:23:07 +08:00
序列化。。。
|
19
realpg 2016-06-04 09:26:23 +08:00
有三种:
文件,网络,共享内存 文件可以利用高层实现的锁,也可以映射到内存增加存取速度 共享内存不用说了 网络是概念,具体实现上有使用 TCP/UDP 的 在网络上有高层协议使用 http 流或者原生二进制流的,然后各种流都有承载内容类型的封装 |
20
visonme 2016-06-04 09:33:25 +08:00
大多数回答都是集中在数据交换和功能调用上,这类的依据有消息队列, web 服务,共享内存, socket ,动态链接库等,而 json/XML/PF 最多就是一种数据契约。
还有种我们说的通信是一种语言包含了解释 /编译 /运行另一种语言的模块或者功能,比如 lua 和 C/C++ |
21
ElloRay 2016-06-04 09:40:05 +08:00
thrift 没人用吗
|
22
kanner 2016-06-04 10:10:22 +08:00
thrift 的序列化+thrift 的 RPC
|
23
elgoog1970 2016-06-04 10:26:00 +08:00
json,xml,protobuf, .....
|
24
tobyxdd 2016-06-04 10:28:37 +08:00 via Android
socket 挺好
|
25
ooTwToo 2016-06-04 10:34:43 +08:00 via iPhone
总归都是 tcp 和 udp 吧
|
26
quericy 2016-06-04 10:42:30 +08:00
json,msgpack
|
27
alexapollo 2016-06-04 10:43:07 +08:00
@ooTwToo RPC 才走协议栈
|
28
alexapollo 2016-06-04 10:43:39 +08:00
|
29
edfward 2016-06-04 11:49:11 +08:00
@alexapollo https://github.com/uber/tchannel Uber 内 thrift+tchannel 挺常见的
|
30
alexapollo 2016-06-04 11:50:45 +08:00
@edfward hmm ,我在想 thrift 对比 grpc 是否更成熟点
|
31
alexapollo 2016-06-04 11:51:52 +08:00
默默给各位安利一下刚刚画的两张图,说明这些技术、概念的关系的
传送门 1 : http://www.anwcl.com/wordpress/ipc-rpc/ 传送门 2 : http://www.v2ex.com/t/283430#reply0 |
32
smithtel 2016-06-04 13:37:31 +08:00
ICE
|