`

让Thrift支持双向通信

阅读更多

【问题】

 

Thrift采用了C/S模型,不支持双向通信:client只能远程调用server端的RPC接口,但client端则没有RPC供server端调用,这意味着,client端能够主动与server端通信,但server端不能主动与client端通信而只能被动地对client端的请求作出应答。这种RPC模式在某些应用中存在缺陷,比如:有些应用,在大部分情况下,client端会主动向server端发请求或者向server端发送数据,而在少部分情况下,server端也需要主动向client发送一些命令,告知进行某些操作。

(什么是Thrift,可参考:Thrift架构介绍

为了解决该问题,通常有三种方案可供选:

方案一:轮询

该方案很容易想到:client端周期性地向server端询问是否需要进行某些操作,如果需要,则什么也不做,如果需要,则按照server的应答(response)要求进行操作。该方案的不足是延迟较大、且会浪费大量资源,造成不必要的访问开销。

方案二:双client/server

通信双方都既是client,也是server。该方案需要在通信双方之间建立两个通信通道,开启两个端口,这比较繁琐,且很不优雅。但仍是目前普遍采用的一套方案。

client/server <————————-> client/server

方案三:异步共享通道

Thrit底层实际上是socket,而socket是支持双向传输的,因此,我们完全可以通过修改thrift本身实现双向传输。有兴趣的读者可参考:

http://joelpm.com/2009/04/03/thrift-bidirectional-async-rpc.html

分享到:
评论

相关推荐

    thrift通过openssl加密证书实现双向通信

    thrift框架通过vs2013编译好的静态库,然后通过vs2013实现双向通信代码,通信协议利用openssl加密证书的方式来实现,本资源给出了完整的实现代码,证书可以在网上百度一下,看看如何生成客户端和服务端的,然后编译...

    Thrift Java 服务器 客户端通信

    此外,Thrift还支持C++, Python, PHP, C#, Ruby等多种编程语言,使得跨语言通信变得简单易行。 总结来说,Thrift在Java中的服务器和客户端通信涉及以下几个关键步骤: 1. 定义服务接口(IDL文件)。 2. 使用Thrift...

    Thrift双向通讯java代码

    在"Thrift双向通讯java代码"这个主题中,我们主要讨论如何使用Thrift在Java环境中实现客户端和服务器端的双向通信。双向通信意味着服务器和客户端都可以向对方发送请求并接收响应,这对于构建复杂的分布式系统至关...

    C++实现Thrift双向通信实例V1.0

    本文将详细讲解如何使用C++实现Thrift双向通信,并以提供的"ThriftServer"和"ThriftClient"为例进行分析。 首先,理解Thrift的基本工作原理至关重要。Thrift通过定义一个中间描述文件(.thrift),来描述服务接口和...

    thrift框架在linux下编译,实现双向通信demo

    thrift框架在linux下编译,实现双向通信demo,thrift使用的是0.9.3版本,编译后通过自己编写的demo实现客户端服务端的双向通信。已完成编译,源码也在里面,需要libevent和boost库以及openssl库,这些三方库自己下载...

    thrift框架在windows上面实现,编译,并且实现客户端服务端双向通信的demo

    thrift框架使用的0.9.3版本,将其在windows平台上编译,对vs2008和vs2013都实现了编译,且对这两个平台的双向通信demo也实现了编译,源码就在压缩包里面。需要libevent和boost库以及openssl库,这些三方库自己下载...

    Thrift白皮书阅读笔记

    - **传输(Transport)**:Thrift 设计了通用的双向传输接口,让不同的编程语言可以传输原始数据,而无需关注底层实现细节。 - **协议(Protocol)**:Thrift 定义了一种数据编码和解码的协议,确保数据在网络间的...

    利用thrift实现js与C#通讯的实例代码

    thrift是通信工具,js是客户端,C#是服务端。  1.2 使用js直接与thrift server通信。让web开发变得更简单。如果使用Web Service,你需要自己去实现C/S两端的序列化与反序列化操作,还需要自行处理异常,降低了开发...

    bijection-thrift_2.9.3-0.5.2.zip

    在深入讨论之前,让我们先了解一下 Bijection 和 Thrift: 1. **Bijection**:Bijection 是 Scala 库,提供了一种简洁的方式来实现对象和数据结构之间的转换。它支持多种序列化格式,如 JSON、Avro、Thrift 等,...

    java网络即时通信系统

    WebSocket是一种在浏览器和服务器之间建立长连接的协议,它极大地简化了双向通信。Java的WebSocket API(JSR 356)使得开发者可以轻松地在Java应用中实现WebSocket服务。通过WebSocket,网络即时通信系统能实现实时...

    erlang与C#一次通信.rar

    TCP/IP是底层的基础,提供了可靠的双向通信通道。HTTP则更便于构建RESTful API,但可能在性能上不如直接的二进制协议。如果使用自定义的二进制协议,可以更高效地传输数据,但需要在两端都实现解析和编码逻辑。 在...

    sand-thrift:Sand.js 的简单节俭库

    3. **数据绑定**:支持双向数据绑定,允许开发者轻松地将视图层与模型层进行同步,简化了状态管理和视图更新的逻辑。 4. **DOM操作**:提供了一些高效且易用的DOM操作方法,如选择元素、添加/删除元素等,使得DOM...

    java网络编程学习资料

    还有WebSocket协议,用于实现持久化的双向通信,Java提供了`javax.websocket`包来支持WebSocket编程。 最后,学习资料中可能包含关于异常处理和网络安全的内容。在进行网络编程时,必须妥善处理IOException和其他...

    simple-parent

    gRPC提供了流式调用和双向通信,适合高吞吐量、低延迟的场景。 6. **Apache Thrift**:Thrift是一种跨语言的服务开发框架,它将接口定义语言(IDL)转换为多种语言的代码,从而简化了跨平台的服务交互。 每种技术...

    tchannel-python:TChannel协议的Python实现

    它支持多种传输方式,如 TCP 和 UDP,旨在提供可靠的请求/响应、双向流和广播模式。TChannel 提供了诸如超时、重试、服务发现等高级特性,使得构建高可用、容错的分布式应用变得更加容易。 在 Python 中,TChannel ...

    最简单的JAVA RPC框架实现

    Socket提供了低级别的网络通信能力,允许两个进程通过TCP/IP协议进行双向通信。 2. **序列化与反序列化**:由于数据需要在网络中传输,因此需要将对象转换为字节流(序列化),到达目的地后再恢复为对象(反序列化...

    JAVA_wangluohuiyi.rar_java 网络会议_会议 java_会议系统_网络会议_网络会议系统

    这可能需要借助于Java的分布式计算框架,如Apache Thrift或gRPC,来实现高效的服务间通信。 总的来说,"JAVA_wangluohuiyi.rar"提供的源码可能包含了上述的诸多技术,对于学习和理解Java网络会议系统的设计与实现...

    基于javatcpsocket通信的拆包和装包源码-chaugod:乔戈德

    socket通信的拆包和装包源码 Java IO 文件流: 磁盘 Socket流: 网络 字节/字符数组流: 内存(byte[], char[]) 缓冲流: 缓冲区(byte[], char[]), 装饰器模式 对象流: 对象, 装饰器模式, 序列化/反序列化 基本数据类型流...

    java通讯软件源码

    在通讯软件中,Socket用于创建客户端和服务器端的连接,通过输入/输出流进行数据的读写,实现双向通信。 2. **多线程**:为了处理并发连接和提高性能,Java通讯软件通常会采用多线程技术。每个连接可以由一个单独的...

    Java远程控制源代码

    Socket提供了两台机器之间进行双向通信的通道。在远程控制场景中,服务器端创建一个监听Socket,等待客户端的连接请求,一旦连接建立,客户端和服务器端就可以通过Socket交换数据,实现命令的发送与执行。 3. **多...

Global site tag (gtag.js) - Google Analytics