Tips for thrift
Introduction
I have designed and developed game servers successfully with thrift (http://thrift.apache.org/). I am writing here some tips to share my experience. I hope that this will help someone who is just trying to solve the same problems that I have met.
Background
Thrift is mainly for scalable cross-language services development ( what it's website has written).Someone may mention Google ProtocolBuff. I have used ProtocolBuff some projects. However, I like thrift more than Google protocolbuff. There are two reasons:
- Thrift support array and map. That is so nice.
- The Codes that thrift framework generated are much more readable just like which I writes them myself.
When developing MMO Server, I use messages to communicate with client which is may implemented by different language e.g., as3. So thrift is very suitable for interchange messages. But there is another circumstance to use thrift.As you know the part of the logic of game server, is modified frequently. Along with project progressing, More property will be added to player object or sub structure. So we will add more fields or rows to db for storing extra data. With version issues being considered, that's much more annoying. I create a blob field to db table that stores a thrift object. With advantages of version supporting, It's easy to add more property to player.
Flash AS3 Wrap
Thrift is originally designed for RPC. How it works for RPC is easy to find if you Google it. I will not write more for this part. But there is less articles to introduce how thrift can be used to communicate message in real time system. Thrift support as3 but just for RPC. So I add some files for supporting message communicating. That another reason why I like thrift that the codes are so readable that it's so easy to extend thrift. Though I am not a professional as3 engineer (I am professional in C++), I implement that easily. I implement two functions to wrap serialization and deserialization.
public class FFUtil { public static function EncodeMsg(msg:TBase, ba:ByteArray):void
{
var tran:FFMemoryTransport = new FFMemoryTransport(ba);
var proto:TBinaryProtocol = new TBinaryProtocol(tran);
msg.write(proto);
}
public static function DecodeMsg(msg:TBase, ba:ByteArray):Boolean
{
var tran:FFMemoryTransport = new FFMemoryTransport(ba);
var proto:TBinaryProtocol = new TBinaryProtocol(tran);
msg.read(proto);
return true;
}
}
I have uploaded flash_example.zip file which includes my extending as3 lib files and a exampl.as file. Actually it's a chat tutorial application using thrift.
C++ Wrap
There are some dissatisfied aspects in thrift C++ implement codes that they depend boost library. Generally it's not a big problem as most of C++ projects have been using boost. But someone who just want to integrate thrift easily finds it annoying. In some mobile app project with C++, they will not want to depend boost too. Actually I don't find good enough reason to must implement thrift of C++ version with boost. Most of use of boost in thrift are for assert test and smart pointer. Thanks to readable codes, I find it easy to wipe dependency of boost. Actually I still recommend you to use official version. But if you just want try thrift as soon as possible you can try this version of no boost. By the way, this C++ version of no boost supports binary encoding only.
int main(int argc, char **argv)
{
shared::SharedStruct msg, dest;
msg.value = "nihao";
std::string data;
ffthrift_t::EncodeToString(msg, data);
printf("data size=%u\n", data.size());
ffthrift_t::DecodeFromString(dest, data);
printf("dest value=%s\n", dest.value.c_str());
return ;
}
I have uploaded ffthrif_cpp_example.zip file which includes my extending C++ files and a example file.
For Storing
I use MySQL. There I show the model of game structure as an example. For storing players' data I design a table named player_info for players' base property such as level, gold, exp...
The field of Extra_Data is special and important. It is a blob type for storing thrift. For example, I design a such thrif file:
namespace cpp ff
namespace as3 ff
namespace py ff
struct extra_data_t {
: list<i32> val1
: string val2
: map<i32, string> val3
}
thrift-0.9.0.exe -gen cpp msg_def.thrift
I will store extra_data_t
to field of Extra_Data. There are such features:
- Because of supporting of version, we can add more field to
extra_data_t
but not to modify MySQL table structure. We have hundreds of game server so that we always update some of server first, if anything is ok, we make all servers updated to newest version. Thrift and blob make us agile enough to handle these situations. We don't need to modify db frequently and the part of db operations is stable. - Thrift supports list and map which it's convenient for us and it‘s codes are very readable, we can use
extra_data_t
as base structure ofplayer_t
class.
But we must use thrift properly. If you chose to store thrift object to db blob, you will give up query this field by SQL. So my tips are:
- store those field as base type of db that needs to be queried by SQL. Such as level, exp, gold, socre...
- store those field in thrift object that don't needs to queried by SQL. Though thrift object in db blob can't be queried by SQL, not mean it can be queried no way. Thanks to thrift supporting for lots of languages, thrift objects can be queried by scripts. We developed some web pages with PHP to show data from db.
Summary
- Actually here thrift is a serialization and deserialization framework other than RPC framework.
- RPC mechanism doesn't fit for me. I just use thrift to gen message that supports version.
- With supporting version, thrift can be used in db storing data. We will get more agile by storing thrift object in db blob.
- file download: http://www.codeproject.com/Articles/660671/Tips-for-thrift-Message-and-store
Tips for thrift的更多相关文章
- Thrift入门及Java实例演示<转载备用>
Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...
- RPC学习----Thrift快速入门和Java简单示例
一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...
- C++库(Thrift)
Thrift通信框架 0 简介 Thrift是一个软件通讯框架,用来进行可扩展且跨语言的服务的开发,最初由Facebook于2007年开发,2008年进入Apache开源项目.它结合了功能强大的软件堆 ...
- Thrift入门及Java实例演示
目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...
- Apache Thrift学习之一(入门及Java实例演示)
目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...
- Thrift入门
简介 Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Has ...
- Thrift IDL使用方式
I.背景 众所周知,Thrift是一个RPC的框架,其可用于不同语言之间的服务相互调用.比如最近接触到的一个运用环境: *前端使用Node.Js重构了部分我们的老旧代码(前后端未分离的SpringBo ...
- Thrift快速入门
Thrift 简单示例 2017-01-19 16:47:57 首先通过先面两个示例简单感受一下Thrift(RPC)服务端与客户端之间的通信...... RPC学习----Thrift快速入门和Ja ...
- Apache Thrift with Java Quickstart(thrift入门及Java实例)
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl ...
随机推荐
- 关于X锁的问题--由select+X锁是否持有到事务结束的误区
前言:看了宋桑的文章<一次意外的X锁不阻塞问题>,结合本人的测试,说明一下我对select中使用X锁是否会持有到事务结束产生的误区: 详情不多说了,详见宋桑的<一次意外的X锁不阻塞问 ...
- Orchard Compact v1.7.2
1. 仅包留了Core中的Settings和Shapes, 及Modules, Themes和jQuery模块. 2. 添加了对Oracle的支持. 下载地址: 二进制: Orchard.Compac ...
- 用c#开发微信 (6) 微渠道 - 推广渠道管理系统 1 基础架构搭建
我们可以使用微信的“生成带参数二维码接口”和 “用户管理接口”,来实现生成能标识不同推广渠道的二维码,记录分配给不同推广渠道二维码被扫描的信息.这样就可以统计和分析不同推广渠道的推广效果. 本系统使用 ...
- Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能
前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...
- C#设计模式(23)——备忘录模式(Memento Pattern)
一.引言 在上一篇博文分享了访问者模式,访问者模式的实现是把作用于某种数据结构上的操作封装到访问者中,使得操作和数据结构隔离.而今天要介绍的备忘者模式与命令模式有点相似,不同的是,命令模式保存的是发起 ...
- 客户端缓存 HTML + 远程数据 JS 的思路。
移动客户端,采用客户端集成 WebBrowser 的方式 ,加载远程网页的优化方案. 1. 远程 HTML版本 v1.2 一次性加载到客户端 2. 手机端打开时,检测HTML版本. 如果有新版,先更新 ...
- [Hyper-V]制作一个干净的操作系统模板
描述: 在Hyper-V里创建虚拟机的时候,我们可以先来创建一个干净的操作系统,将其制作为操作系统模板,该虚拟机的磁盘文件也将被视作基础磁盘以方便基于它创建差异化磁盘 安装其它虚拟机的时候就可以差异化 ...
- NBIbatis 基础框架
基础框架 NBIbatis 为真实在用的系统中剥离出的一个ibatis.net应用框架,目的在于通过此项目让软件工程师集中关注表现层及业务规则编写. 通过数据访问和业务规则可快速搭建不同表现形式的网站 ...
- [安卓] 8、VIEW和SURFACEVIEW游戏框架
这是个简单的游戏框架,上图显示我们实现了屏幕上对象的位置控制.这里要1个简单的layout资源和2个java类:在MainActivity中主要和以往一样,唯一不同的是去除电池图标和标题等操作,然后第 ...
- [jQuery学习系列三 ]3-JQuery学习二-字典操作
前言:如果看过了第一篇和第二篇, 相信大家会对jQuery有个初步的认识了, 对于jQuery的选择器和数组的操作都已经很熟悉了, 这一篇就单独罗列jQuery中字典的操作相关的内容. 1. 数组中添 ...