- 浏览: 109102 次
- 性别:
- 来自: 昆明
文章分类
- 全部博客 (151)
- 120D02 (5)
- 直升机 (1)
- 我的技术资料收集 (82)
- 的技术资料收集 (4)
- .NET Solution (2)
- ASP.NET (1)
- Linq to sql (1)
- 数据库技术(MS SQL) (2)
- 架构/设计 (1)
- 敏捷/持续集成 (1)
- C#.NET开发 (1)
- Matlab开发 (1)
- WinForm开发 (1)
- 开源技术 (1)
- jQuery (1)
- 我的博文 (4)
- js (2)
- android (2)
- 9. 读书笔记 (1)
- CSS3 (1)
- HTML5 (1)
- JavaScript (5)
- 移动开发 (2)
- 编程心得 (1)
- Linux操作系统 (1)
- (BI)商业智能 (1)
- IOS (1)
- Windows Phone (2)
- C# API (1)
- JQuery系列 (1)
- TFS (1)
- C# (2)
- ExtJs (1)
- .NET (1)
- Nginx (1)
- WCF学习笔记 (1)
- Computer Graphic (1)
- IT产品 (1)
- 工具分享 (1)
- MySelf (1)
- C#专栏 (1)
- 管理 (1)
- 基于Oracle Logminer数据同步 (1)
- 日常 (1)
- 实用工具 (1)
- 网页设计 (1)
- avalon (1)
- flash (1)
- DDD (1)
- 01 技术Android (1)
- WCF (1)
- selenium (1)
最新评论
-
464410531:
三国杀。。。。。。。。。。。。。。。。。。。。。。。。。。。。 ...
实用的职场宝典:不提拔你,就因为你只想把工作做好
原帖地址:http://www.cnblogs.com/zhiranok/archive/2013/06/06/ffrpc.html
FFRPC
FFRPC 已经陆陆续续开发了1年,6月6日这天终于完成了我比较满意的版本,暂称之为 V0.2,FFRPC实现了一个C++版本 的异步进程间通讯库。我本身是做游戏服务器程序的,在服务器程序领域,系统是分布式的,各个节点需要异步的进行通信, 我的初衷是开发一个易用、易测试的进程间socket通信组件。实际上FFRPC 已经是一个框架。
FFRPC 主要特性
- FFRPC 采用Epoll Edge Trigger模式,这里特别提一下ET是因为在异步工作模式,ET方式才是epoll最简单也是最高效的方式 网上的很多帖子写LT简单易用,那纯碎是没有理解ET的精髓之所在,如果读者想要从ffrpc中探究一下ET的奥妙,提醒读者的是 请把Epoll 看成一个状态机!FFRPC 采用Broker模式,这样的好处是 Scalability!! 在游戏领域的开发者一定很熟悉Master/Gateway/Logic Server的概念, 实际上Master 实际上扮演的Broker master的角色,而gateway扮演的是Broker slave的角色,Broker Slave负责转发客户端的 请求到Logic Service,提供一个转发层虽然会增加延迟,但是系统变得可扩展,大大提高了吞吐量,这就是Scalability!! 而Broker master负责管理所有的Master Slave,负责负载均衡。不同的client分配不同的Broker SLave。
- FFRPC 就是基于以上的思路,有如下四个关键的概念:
- 一:broker master 负责负载均衡,同步所有节点的信息,所有的slave broker和rpc service/ rpc cleint都要连接broker master。
- 二:slave broker负责完成service和client间转发消息,如果service、client和broker在同一进程,那么直接在内存间投递消息, 这是v0。2的重要的优化,v0。1时没有此功能,网友很多反应这个问题,看来大伙对优化还是太敏感! 另一个创新之处在于ffmsg_t,封装了消息的序列化和反序列化,我已经厌倦了protobuff,如果你也研究了为每个消息定义cmd 和为cmd写switch(有些人可能已经用上注册回调函数,但还有更好用的)。实际上定义消息结构体时一个消息本身就是独一无二的, 所以为什么我们还要给消息在定义一个cmd呢?比如定义了struct echo_t{int a;}消息,echo_t名称本身就是独一无二的,否则编译 器肯定报错了,那么为什么不直接用echo_t这个名称作为cmd呢?在FFRPC中可以使用TYPE_NAME(echo_t)获得消息体名称字符串, 是滴TYPE_NAME是一个很有意思的实现,c++中并没哟关键字可以获取一个类的名称,但是所有的编译器都实际上已经提供了这个功能! 详情请看源码。有读者可能会纠结使用消息体结构的名称做cmd固然省事,但是浪费了流量!32位的cmd总是比字符串省流量,是的这个 结论虽然我很不喜欢(我总是懒的优化,除非...被逼的),但是他是对的!ffrpc中很好的解决了这个问题,当每个节点初始化时都要 注册到broker master,这时所有的消息都会在master中分配一个唯一的msg id,这样就可以用整数1代表echo_t结构了,由于每个节点 都知道echo_t到1的映射,所以程序员再也不用手动定义cmd了,broker唯一初始化时动态定义。
- 三:ffrpc service,提供接口的模块,也就就是服务端,通过ffrpc类注册的接口基于异步模式,推荐的模式是每个消息都返回 一个结果消息
- 四:ffrpc client是调用的ffrpc service的模块,基于异步模式,记住服务名成和消息名称唯一的确定一个接口,这个c++的类和类接口 概念是一致的,而且调用远程接口时可以指定回调函数,而且回调函数还支持lambda参数绑定!
- 想快速见证ffrpc库的魅力可以小看如下的示例,只要你有linux系统,可以1分钟内测试这个示例,ffrpc没有其他依赖,提醒你的是 FFRPC的日志组件是彩色的哦!
示例代码
#include <stdio.h>
#include "base/daemon_tool.h"
#include "base/arg_helper.h"
#include "base/strtool.h"
#include "base/smart_ptr.h"
#include "rpc/ffrpc.h"
#include "rpc/ffbroker.h"
#include "base/log.h"
using namespace ff;
//! 定义echo 接口的消息, in_t代表输入消息,out_t代表的结果消息
//! 提醒大家的是,这里没有为echo_t定义神马cmd,也没有制定其名称,ffmsg_t会自动能够获取echo_t的名称
struct echo_t
{
struct in_t: public ffmsg_t<in_t>
{
void encode()
{
encoder() << data;
}
void decode()
{
decoder() >> data;
}
string data;
};
struct out_t: public ffmsg_t<out_t>
{
void encode()
{
encoder() << data;
}
void decode()
{
decoder() >> data;
}
string data;
};
};
struct foo_t
{
//! echo接口,返回请求的发送的消息ffreq_t可以提供两个模板参数,第一个表示输入的消息(请求者发送的)
//! 第二个模板参数表示该接口要返回的结果消息类型
void echo(ffreq_t<echo_t::in_t, echo_t::out_t>& req_)
{
echo_t::out_t out;
out.data = req_.arg.data;
LOGDEBUG(("XX", "foo_t::echo: %s", req_.arg.data.c_str()));
req_.response(out);
}
//! 远程调用接口,可以指定回调函数(也可以留空),同样使用ffreq_t指定输入消息类型,并且可以使用lambda绑定参数
void echo_callback(ffreq_t<echo_t::out_t>& req_, int index)
{
LOGDEBUG(("XX", "%s %s %d", __FUNCTION__, req_.arg.data.c_str(), index));
}
};
int main(int argc, char* argv[])
{
//! 美丽的日志组件,shell输出是彩色滴!!
LOG.start("-log_path ./log -log_filename log -log_class XX,BROKER,FFRPC -log_print_screen true -log_print_file true -log_level 6");
//! 启动broker,负责网络相关的操作,如消息转发,节点注册,重连等
ffbroker_t ffbroker;
ffbroker.open("app -l tcp://127.0.0.1:10241");
//! broker客户端,可以注册到broker,并注册服务以及接口,也可以远程调用其他节点的接口
ffrpc_t ffrpc_service("echo");
foo_t foo;
ffrpc_service.reg(&foo_t::echo, &foo);
ffrpc_service.open("app -broker tcp://127.0.0.1:10241");
ffrpc_t ffrpc_client;
ffrpc_client.open("app -broker tcp://127.0.0.1:10241");
echo_t::in_t in;
in.data = "helloworld";
//! 你没有看见get_type_name定义,但是他确定存在
printf("测试获取类名:%s\n", in.get_type_name());//输出为:测试获取类名:echo_t::in_t
for (int i = 0; i < 100; ++i)
{
//! 如你所想,echo接口被调用,然后echo_callback被调用,每一秒重复该过程
ffrpc_client.call("echo", in, ffrpc_ops_t::gen_callback(&foo_t::echo_callback, &foo, i));
sleep(1);
}
sleep(300);
ffbroker.close();
return 0;
}
总结
- ffrpc中broker、client、service可以启动在不同的进程,如果在同一进程,那么直接内存间投递消息
- ffrpc 每个实例单独启动一个线程和任务队列,保证service和client的操作都是有序、线程安全的。
- 如果你研究过protobuff、thrift、zeromq、ice等等类库/框架, 更要试用一下ffrpc。
发表评论
-
Javascript:猜猜弹出的是啥?为啥? - 幸福框架
2013-06-28 13:33 430原帖地址:http://www.cnblogs.com/hap ... -
C#中WindowsForm常见控件的运用 -- - 李晓峰
2013-06-28 13:27 1747原帖地址:http://www.cnblogs.com/liy ... -
海量数据处理利器之Hash——在线邮件地址过滤 - MyDetail
2013-06-27 12:00 654原帖地址:http://www.cnblo ... -
ASP.NET MVC 4 for Visual Studio 2010 下载地址 - 张鸿伟
2013-06-27 11:48 754原帖地址:http://www.cnblogs.com/wei ... -
【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化 - r01cn
2013-06-26 11:00 919原帖地址:http://www.cnblogs.com/r01 ... -
[珠玑之椟]估算的应用与Little定律 - 五岳
2013-06-26 10:54 639原帖地址:http://www.cnblogs.com/wuy ... -
30行,金额转人民币大写的代码 - 史蒂芬.王
2013-06-26 10:42 1028原帖地址:http://www.cnblogs.com/ste ... -
从银行的钱荒看一个公司的团队建设 产品线过多最终导致最赚钱的项目面临破产 - James Li
2013-06-26 10:36 632原帖地址:http://www.cnblogs.com/Jam ... -
Windows 8 动手实验系列教程 实验6:设置和首选项 - zigzagPath
2013-06-25 13:39 535原帖地址:http://www.cnblogs.com/zig ... -
闲聊可穿戴设备 - shawn.xie
2013-06-25 13:33 616原帖地址:http://www.cnblo ... -
如何使用开源库,吐在VS2013发布之前,顺便介绍下VS2013的新特性"Bootstrap" - 量子计算机
2013-06-25 13:27 869原帖地址:http://www.cnblogs.com/DSh ... -
一步一步将自己的代码转换为观察者模式 - 文酱
2013-06-23 11:36 611原帖地址:http://www.cnblo ... -
iOS内存错误EXC_BAD_ACCESS的解决方法(message sent to deallocated instance) - VicStudio
2013-06-23 11:30 543原帖地址:http://www.cnblogs.com/vic ... -
记录asp.net在IE10下事件丢失排错经过 - Adming
2013-06-23 11:24 712原帖地址:http://www.cnblogs.com/wea ... -
记 FineUI 官方论坛所遭受的一次真实网络攻击!做一个像 ice 有道德的黑客! - 三生石上
2013-06-23 11:18 793原帖地址:http://www.cnblogs.com/san ... -
3、使用Oracle Logminer同步Demo
2013-06-19 10:33 571原帖地址:http://www.cnblogs.com/shi ... -
算法实践——数独的基本解法
2013-06-19 10:27 1450原帖地址:http://www.cnblogs.com/gre ... -
简单实现TCP下的大文件高效传输
2013-06-19 10:21 692原帖地址:http://www.cnblogs.com/sma ... -
avalon - 初步接触
2013-06-18 10:06 785原帖地址:http://www.cnblogs.com/aar ... -
Nginx学习笔记(一) Nginx架构
2013-06-18 09:59 529原帖地址:http://www.cnblogs.com/cod ...
相关推荐
本示例以“C#与C++进程间通信”为主题,利用命名管道(Named Pipe)作为通信媒介,实现了不同类型数据结构的高效传输。 命名管道是一种在操作系统中提供半双工或全双工通信的机制,适用于在同一台计算机上的进程间...
libjson-rpc-cpp是C++语言实现的一个开源库,专门用于构建JSON-RPC服务器和客户端应用。这个框架为开发人员提供了一种简单、高效的方式来进行跨平台的通信,支持HTTP和TCP/IP协议,同时还提供了异步调用的能力。 ...
在计算机网络通信中,Socket接口是一种标准的、通用的通信机制,用于实现不同系统之间的进程间通信(IPC)。本篇将通过一个简单的示例,介绍如何使用C++语言编写基于UDP协议的Socket服务器端和客户端程序。 首先,...
此程序为C++的程序,使用MFC做的界面,此程序实现了服务器与客户端的通信,使用socket通信。一个服务器端可以同时对应多个客户端,此程序代码注释清楚,十分适合应用与学习。服务器端和客户端之间可以发送指定的自己...
在这个场景中,我们关注的是C++编写的服务器和Java编写的客户端如何利用Socket进行通信。下面将详细介绍这个过程。 首先,让我们了解Socket的基本概念。Socket可以被看作是两台计算机之间的通信端点,它提供了低...
- **PushFramework**: 这可能是一个框架或者库,用于帮助服务器进行数据推送,使得服务器能够主动向客户端发送数据,而不仅仅是响应客户端的请求。 - **WebClient**: 这可能是HTML客户端的源代码,可能包含HTML...
1 一个服务器对多个客户端之间进行通信 2 实现多线程开发,共包括接收数据线程、发送数据线程、主线程、接收客户端连接线程、清理资源线程。 其中主线程负责数据的输入,清理资源线程主要负责清理不需要的内存空间...
在C++编程环境中,利用MFC(Microsoft Foundation Classes)库可以实现TCP通信的服务器和客户端。MFC是微软提供的一套面向对象的类库,用于简化Windows应用程序开发。 首先,我们来看`TcpServer`文件,这是实现TCP...
本话题将探讨如何使用C++客户端与Java(通过Netty框架)服务器端实现TCP通讯,并涉及数据序列化工具Protocol Buffers(protobuf)在两者之间的交互。 首先,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节...
毕设项目--幻菱塔防+游戏客户端为Unity编写,游戏服务器端为Linux C++编写+毕业设计(源码,包含客户端、服务器端) 毕设项目--幻菱塔防+游戏客户端为Unity编写,游戏服务器端为Linux C++编写+毕业设计(源码,包含...
- **套接字(Sockets)**:适用于网络环境下的进程间通信,也可用于同一主机上的进程通信。 - **消息队列(Message Queues)**:允许进程存储和接收消息,提供同步和数据传递。 - **共享内存**:多个进程可以直接...
本文将深入探讨C++中的Socket编程,这是实现服务器和客户端通信的基础。 首先,让我们理解什么是Socket。Socket是网络通信中的一个抽象概念,可以看作是两台计算机之间进行数据交换的端点。在C++中,我们通常使用`...
主要是对dbus进行c++封装成了一个dbus类,对外保留发送和接收的接口,方便使用;另外实现多进程dbus的双向通信测试,详细说明见博客的编译(移植)以及双向通信使用例程>>
在IT领域,C/C++语言被广泛用于开发服务器与客户端应用程序,特别是在网络通信中,TCP(传输控制协议)是常用的一种面向连接的、可靠的、基于字节流的传输层通信协议。本项目“c/c++服务器与客户端程序”显然关注的...
此外,为了跨进程通信,COM接口需要正确配置,包括注册和激活策略,确保C++客户端能够成功创建C# WCF客户端实例。 总结一下,本篇文章主要介绍了如何在C#中创建一个支持双工通信的WCF服务,并通过COM接口让C++...
C++作为一门强大的编程语言,可以很好地实现Socket接口,构建服务器和客户端应用。在这个项目中,我们将探讨如何使用C++在Visual Studio 2008环境下实现Socket服务器和客户端的基本功能。 首先,Socket在C++中主要...
新版的Dev-C++,已经修复了CPU 100%占用、卡死等Bug。但仍有一个Bug:从某一文件打开Dev-C++时,只能使用英文界面。下载之前请注意。
在IT领域,网络通信是至关重要的组成部分,尤其是在开发应用程序时,服务器与客户端之间的交互是必不可少的。本项目专注于使用Qt库来实现基于TCP(Transmission Control Protocol)的服务器和客户端通信。Qt是一个跨...
最近项目需要,需要实现C++客户端和WCF服务器双工通信。但C++没有好用的WCF实现框架。经过一番折腾,想出了个通过COM与C#的WCF客户端通信的方法。拿出来分享一下。 有不明白的请看博客:...