Huihoo.org - Open Source Middleware Foundation

 Last Modified: 2003.02.10 15:00 PM

goer的设计与实现


(灰狐动力-开源中间件项目 by huihoo.org)

mengwenguang是交易中间件Goddess和消息中间件goer的作者,产品主页:http://cwqu.3322.org/

orbat对大家说: hi,大家都首先简单介绍一下自己吧(10:09)

nkyu对大家说: 我是新来的,喜欢java开发,但是目前做的是企业信息化pdm,erp之间的数据交换的接口(10:10)

orbat对大家说: 我是 orbat,负责 jfox 的开发,现在正在进行 jms 规范以及一些源代码的阅读(10:11)

allen_long对大家说: 我是Allen,组织、协调huihoo上多个项目的开展,希望与大家有更多交流与协作(10:12)

orbat对大家说: zongfeng 来了没有?(10:13)

allen_long对nkyu说: 能说说你们pdm,erp之间的数据交换的接口采用是什么方法和技术(10:13)

foxdens对大家说: 大家好,我是一个java爱好者,目前在看struts,对中间件有很大兴趣^_^(10:13)

allen_long对mengwenguang说: 给大家介绍一下你的消息中间件goer的设计与实现(10:14)

nkyu对大家说: 很普通的技术,因为买不起基于中间件的,自己做,vb开发(10:14)

mengwenguang对大家说: 好的(10:15)
mengwenguang对大家说: goer采用类似邮件的用户管理方式(10:16)
mengwenguang对大家说: 域 DOMAIN 如 orient.com(10:16)
mengwenguang对大家说: 标识一个用户组(10:17)
mengwenguang对大家说: 用户 USER 如 meng@orient.com用户间交互信息如 A2<=>Am 由域管理器完成(10:17)

orbat对mengwenguang说: 你的 goer 是基于 jms 的吗?(10:18)

mengwenguang对大家说: 不是(10:18)
mengwenguang对大家说: 直接基于tcpip定义消息的(10:19)

orbat对mengwenguang说: 那是基于什么的呢?(10:19)
orbat对mengwenguang说: 哦(10:19)

mengwenguang对大家说: 没有遵循其他什么规范(10:19)

orbat对mengwenguang说: 有线程池这样的机制在里面吗?(10:19)

mengwenguang对大家说: 实际上我觉得mq\tonglink应该都没什么规范(10:19)

allen_long对mengwenguang说: 能和其他的中间件进行互操作吗?如mq/tonglink(10:20)

mengwenguang对大家说: goer提供了消息的可靠传输,发送方和接收方之间实现异步通信(10:20)
mengwenguang对大家说: 采用域/用户的管理。(10:20)
mengwenguang对大家说: 支持1对1,1对多的传输。(10:21)
mengwenguang对大家说: 支持多域管理,(10:21)
mengwenguang对大家说: 提供路由配置。(10:21)
mengwenguang对大家说: 提供了别名热备功能。(10:21)
mengwenguang对大家说: 消息存放在 文件系统中(10:22)
mengwenguang对大家说: 在内存中构建了一棵B树作为索引(10:22)

orbat对mengwenguang说: 可以跟我们详细介绍一个路由配置和别名热备功能吗?(10:22)

mengwenguang对大家说: ok(10:23)
mengwenguang对大家说: goer用一个ip和tcp端口唯一标识一个域,当然要配置一个域名(10:24)
mengwenguang对大家说: [general] ;基本信息(10:24)
mengwenguang对大家说: service_port = 20000 ;服务端口(10:24)
mengwenguang对大家说: domain = orient ;域名(10:24)
mengwenguang对大家说: max_life = 36000 ;消息最长生存期(10:24)
mengwenguang对大家说: allow_anonymity = 1 ;是否允许匿名方式登录(10:24)
mengwenguang对大家说: alias = orient.com ;域别名(10:24)
mengwenguang对大家说: 上面是最基本的配置,倒过来了(10:25)
mengwenguang对大家说: [link_domain] ;其它域(10:25)
mengwenguang对大家说: ;格式: domain = host$ip:port,passwd$passwdval(10:25)
mengwenguang对大家说: zgbank = host$134.102.1.1:20000,passwd$1234(10:25)
mengwenguang对大家说: 这里配置了一个相邻域 zgbank(10:26)
mengwenguang对大家说: 这样 a@orient 可以发消息给 b@zgbank(10:26)

orbat对mengwenguang说: 相邻域又是什么?(10:26)

mengwenguang对大家说: [route] ;路由配置(10:26)
mengwenguang对大家说: ;接收方域为 jsbank 的消息都发送到otherbank域去,由otherbank域进行转发(10:26)

mengwenguang对大家说: jsbank = otherbank(10:26)

allen_long对mengwenguang说: 你的系统提供Load Balancing/Fault Tolerance的功能吗?(10:26)

mengwenguang对大家说: ;接收方域为 yzbank 的消息都发送到otherbank域去,由otherbank域进行转发(10:27)
mengwenguang对大家说: yzbank = otherbank(10:27)
mengwenguang对大家说: 路由配置实际上是 把不相邻的域配置到一个相邻的域去(10:27)

mengwenguang对大家说: 这样 a@orient发给 c@yzbank 时(10:28)
mengwenguang对大家说: orient域管理器自动把消息发送给 otherbank域了(10:28)
mengwenguang对大家说: 再由 otherbank 进行下一步传送(10:28)

cmy007对大家说: 大家好(10:28)

mengwenguang对大家说: 相邻域就是和 本域 直接连接的域(10:29)

nkyu对大家说: 哦(10:30)

allen_long对cmy007说: 欢迎你的参与(10:30)

mengwenguang对大家说: 别名主要用于处理 多域互相备份,提高可靠性(10:30)

mengwenguang对大家说: orient域配置了一个别名 orient.com(10:31)

orbat对mengwenguang说: 实现了集群吗?(10:31)

mengwenguang对大家说: 我对集群的概念很模糊(10:32)
mengwenguang对大家说: orient.com 也是一个实际存在的域(10:32)
mengwenguang对大家说: 如果orient.com 死掉了(10:32)

allen_long对mengwenguang说: 你考虑过让你的产品支持JMS规范吗?(10:32)

orbat对mengwenguang说: 就是多台服务器协同工作(10:32)

mengwenguang对大家说: 我希望支持JMS规范,但我对JMS规范不大熟悉(10:33)

orbat对mengwenguang说: 集群不要也罢(10:33)

nkyu对大家说: 我觉得应该是实现了集群的吧(10:33)

allen_long对mengwenguang说: 使用goer提供的开发库开发的应用能跑在其他的消息平台上吗?(10:34)

orbat对mengwenguang说: 在应付高负荷的情况下,goer 有什么措施没有?(10:34)

mengwenguang对大家说: 如果orient.com 死掉了,那么 orient 域管理器会接收发给 orient.com的消息(10:34)
mengwenguang对大家说: 前提是两边的用户名配置前面一样(10:35)
mengwenguang对大家说: 如发给 a@orient.com的消息可发给a@orient(10:35)

orbat对mengwenguang说: 你的 orient.com 和域管理器不再一个线程的吗?(10:35)

mengwenguang对大家说: 这种情况主要用于处理双机热备(10:35)
mengwenguang对大家说: orient.com 是一个域,由一个域管理器进行管理(10:36)
mengwenguang对大家说: 在高负荷的情况下,速度肯定变慢(10:37)
mengwenguang对大家说: 消息会存放到文件系统中(10:37)
mengwenguang对大家说: 每个用户在内存中最多keep50条消息的索引(10:38)

orbat对mengwenguang说: 不好意思,那你的 “orient 域死掉了”,我还没理解(10:38)

mengwenguang对大家说: 相当于有2台机器(10:38)
mengwenguang对大家说: 一台运行 orient域,另外一台运行 orient.com域(10:38)

orbat对mengwenguang说: 你的不同的域跑在不同的机器上?(10:39)

mengwenguang对大家说: orient.com 死掉了,可能是那台机器重新启动了或者其他故障(10:39)
mengwenguang对大家说: 不同的域可以跑在不同的机器上,也可以在同一台机器上(10:39)
mengwenguang对大家说: goer提供的开发库本身是跨平台的,开发的应用能跑在其他的消息平台上,除非应用自身的问题(10:40)

orbat对mengwenguang说: oh, 明白了(10:41)

orbat对mengwenguang说: 不错的构思,结构挺大的(10:41)

mengwenguang对大家说: 我举个例子吧(10:41)

orbat对mengwenguang说: 一个 jms 服务器只相当于你的一个域(10:42)

orbat对mengwenguang说: 好的(10:42)

mengwenguang对大家说: #include (10:42)
mengwenguang对大家说: TMq_Client Cli;(10:42)
mengwenguang对大家说: void Demo_Connect()(10:42)
mengwenguang对大家说: {(10:42)
mengwenguang对大家说: Cli.Set_Server_Ip("127.0.0.1"); //设置服务器IP(10:42)
mengwenguang对大家说: Cli.Set_Server_Port(20000); //设置服务器TCP端口(10:42)
mengwenguang对大家说: Cli.Set_User_Id("user_a"); //设置用户名(10:42)
mengwenguang对大家说: Cli.Set_Passwd("pa"); //设置密码(10:42)
mengwenguang对大家说: if(!Cli.Connect()) //连接(10:42)
mengwenguang对大家说: {(10:42)
mengwenguang对大家说: printf("connect error code %d\n",Cli.Get_Error_Code());(10:42)
mengwenguang对大家说: exit(0);(10:42)
mengwenguang对大家说: };(10:42)
mengwenguang对大家说: printf("connect ok user_id is %s\n", Cli.Get_User_Id());(10:42)
mengwenguang对大家说: };(10:43)
mengwenguang对大家说: void Demo_Send_Msg()(10:43)
mengwenguang对大家说: {(10:43)
mengwenguang对大家说: TMq_Msg msg;(10:43)
mengwenguang对大家说: int id;(10:43)
mengwenguang对大家说: char msgstr[200];(10:43)
mengwenguang对大家说: for(id=0;id<10;id++)(10:43)
mengwenguang对大家说: {(10:43)
mengwenguang对大家说: printf("send %3d msg ",id);(10:43)
mengwenguang对大家说: msg.Set_Destination("user_b@orient"); //设置目标(10:43)
mengwenguang对大家说: //因为在同一个域, 也可以写成 msg.Set_Destination("user_b");(10:43)
mengwenguang对大家说: msg.Set_Expiration(300); //设置消息生存期为300秒(10:43)
mengwenguang对大家说: sprintf(msgstr,"this is %d msg",id+1);(10:43)
mengwenguang对大家说: msg.Set_Content(msgstr,strlen(msgstr)+1); //设置消息内容(10:43)
mengwenguang对大家说: if(!Cli.Send_Msg(&msg))(10:43)
mengwenguang对大家说: printf("fail error code %d\n",Cli.Get_Error_Code());(10:44)
mengwenguang对大家说: else(10:44)
mengwenguang对大家说: printf("ok\n");(10:44)
mengwenguang对大家说: };(10:44)
mengwenguang对大家说: };(10:44)
mengwenguang对大家说: int main(int argc, char **argv)(10:44)
mengwenguang对大家说: {(10:44)
mengwenguang对大家说: Demo_Connect();(10:44)
mengwenguang对大家说: Demo_Send_Msg();(10:44)
mengwenguang对大家说: Cli.Disconnect(); //断开连接(10:44)
mengwenguang对大家说: return 1;(10:44)
mengwenguang对大家说: };(10:44)

orbat对mengwenguang说: OK, 明白(10:44)

mengwenguang对大家说: 一对多发送消息是完全一样的(10:45)
mengwenguang对大家说: 主要在服务端进行一个组配置(10:45)

orbat对mengwenguang说: 那同步和异步之间的区别呢?(10:46)

mengwenguang对大家说: goer中没有同步通信(10:46)

orbat对mengwenguang说: 哦(10:47)

mengwenguang对大家说: 异步的意思是 一个连接发送消息时允许对方(接收方)不接收(10:47)

winux进入聊天室.(10:47)

mengwenguang对大家说: 服务器会进行存储(10:47)

orbat对mengwenguang说: 你觉得在开发的过程中,最难的地方在哪里?(10:47)

mengwenguang对大家说: 存储问题(10:47)
mengwenguang对大家说: 消息多的时候需要考虑效率(10:48)
mengwenguang对大家说: 我没采用数据库(10:48)
mengwenguang对大家说: 因此编了一个b树的类(10:48)

orbat对mengwenguang说: oh(10:49)

mengwenguang对大家说: 所有管理只有一个程序(10:49)

mengwenguang对大家说: 就是 goer 或者 goer.exe(win平台)(10:50)

mengwenguang对大家说: 另外goer考虑了一种提供监控的应用(10:51)

orbat对mengwenguang说: goer 和 goddess 是什么关系?(10:51)

allen_long对winux说: 欢迎你的到来,能否给大家做个简单的自我介绍,你是atcs的作者winix吗?(10:51)

mengwenguang对大家说: 对于管理器的要求是支持客户端动态的加入一个组,或者动态的从一个组连开(10:52)
mengwenguang对大家说: goer和goddess是2个不同的中间件(10:52)
mengwenguang对大家说: goddess主要用于联机事务处理(10:52)
mengwenguang对大家说: goddess不进行消息的存储(10:53)
mengwenguang对大家说: 就是说goddess重新启动了,那么是空的,和上次运行没有关联(10:53)
mengwenguang对大家说: 就是说goddess重新启动了,那么是空的,和上次运行没有关联(10:53)

winux很有礼貌地作了一揖,对大家说: 拜山拜水拜码头,在下初到宝地,请多多关照!(10:54)

allen_long对mengwenguang说: 那么所有的处理信息都丢失了吗?(10:55)

orbat对mengwenguang说: 是不是可以说 goddess 比 goer 多了事务处理,但是少了消息存储?(10:55)

orbat对winux说: 哪里可以看到你的 acts?(10:56)

mengwenguang对大家说: 应该不同(10:56)

mengwenguang对大家说: goddess构建3层体系应用非常方便,goer构建多层体系应用(10:56)

allen_long对orbat说: http://www.huihoo.com/products/atcs/index.htm(10:57)

nkyu对大家说: 大家都好li害(10:58)

allen_long对winux说: 今天我们重点讨论goer,下次我们组织一次专题讨论你的ATCS,如何?(10:58)

winux微笑着对allen_long说: 好的!(10:59)

orbat对mengwenguang说: 那 goer 还有什么可以改进的地方吗?(10:59)

mengwenguang对大家说: goer目前没有改进计划(11:01)
mengwenguang对大家说: goer的编程接口主要有2个类,TMq_Client和TMq_Msg。(11:01)
mengwenguang对大家说: TMq_Client负责连接的建立、断开,消息的发送和接收。(11:01)
mengwenguang对大家说: TMq_Msg负责消息的存储和包装。(11:01)
mengwenguang对大家说: 在建立连接之前,先要设置服务器的IP、TCP端口,用于登录的用户名和口令(如果(11:01)
mengwenguang对大家说: 服务器允许匿名登录则可以不设置用户名及口令)。(11:01)
mengwenguang对大家说: 一般的,一个程序只需要定义一个TMq_Client全局对象就可以了。(11:01)
mengwenguang对大家说: 和服务器连接成功后,就可以不断的发送和接收消息了。(11:02)

winux微笑着对mengwenguang说: 在goer中主要采用了什么通信方式进行消息的异步处理?(11:02)

mengwenguang对大家说: 应该说goer的异步处理和通信方式没有关系(11:03)

dell_yan对大家说: 不好意思:):goer是什么东东?(11:03)

mengwenguang对大家说: goer的异步主要指通信软件可以在不同时刻运行(松散耦合)(11:04)

mengwenguang对大家说: goer是一套消息中间件。提供了消息的可靠传输,发送方和接收方之间实现异步通信。(11:04)

dell_yan对mengwenguang说: 是谁开发的?(11:05)

mengwenguang对大家说: 是我开发的(11:05)

dell_yan对mengwenguang说: 和JMS有什么区别?还是他的一个实现?(11:07)

orbat对mengwenguang说: mengwengguang winux 都是牛人,以后还请多多指教(11:07)

allen_long对dell_yan说: 请先看看 http://cwqu.3322.org/goer/Default.htm(11:07)

nkyu对大家说: 都是高手啊...(11:08)

dell_yan对mengwenguang说: 好的,俺先看看。。。。。。。(11:08)

mengwenguang对大家说: 我觉得消息中间件(我指goer)的内容不多(11:08)

mengwenguang对大家说: 从设计到测试差不多1个月时间(11:09)

orbat对mengwenguang说: 这么快阿(11:09)

nkyu对大家说: 独立开发么?(11:09)

mengwenguang对大家说: 对,开头主要是考虑功能(11:10)

mengwenguang对大家说: 大概1个星期(11:10)

dell_yan对mengwenguang说: 太厉害了!!值得学习!!(11:10)

nkyu对mengwenguang说: 有自己的东东真幸福(11:10)

mengwenguang对大家说: 然后进行设计,大概4天(11:10)

mengwenguang对大家说: b树花了我1星期(11:10)

winux对mengwenguang说: 能谈谈goer中在异构机之间的数据传输格式问题吗?(11:11)

mengwenguang对大家说: 编码(不含B树)1星期(11:11)
mengwenguang对大家说: 传输都开用字节流,就是 unsigned char(11:11)
> mengwenguang对大家说: 肯定不要考虑传输一个int或者long了(11:12)
mengwenguang对大家说: 两边进行转换(11:12)
mengwenguang对大家说: 写文档花些时间(11:14)

winux对mengwenguang说: 客户程序与服务程序是直接建立TCP连接进行交互吗?(11:16)

mengwenguang对大家说: 是的(11:17)

allen_long对mengwenguang说: 讲讲goer是如何实现路由?(11:18)

mengwenguang对大家说: sorry,我得说明开发goer时采用了orient类库,不然时间肯定要多一些(11:18)
mengwenguang对大家说: 比如 a@1要发送消息给c@3(11:18)
mengwenguang对大家说: 这里的1和3是2个不同的域,并且1和3不直接连接(11:19)
mengwenguang对大家说: 另外有个域2同时和1、3相连(11:20)
mengwenguang对大家说: 这样1要通过2把消息送给3,就是a@1 => 2 => c@3(11:20)

allen_long对mengwenguang说: 都是通过静态配置信息实现的吗?(11:20)

mengwenguang对大家说: 那么需要配置路由是 3=2(11:21)
mengwenguang对大家说: 对,是通过静态配置(11:21)
mengwenguang对大家说: 本来想考虑实现动态路由的(11:21)
mengwenguang对大家说: 那样要考虑一个发现机制(11:21)

allen_long对mengwenguang说: 打算实现动态配置路由吗?(11:22)

mengwenguang对大家说: 但我想那样系统规模可适应全球范围了,:)(11:22)
mengwenguang对大家说: 估计goer不会有那样的机会(11:22)
mengwenguang对大家说: 所以就没有做,考虑过(11:23)

allen_long对mengwenguang说: 那不是很好,你的担忧是什么?(11:23)

mengwenguang对大家说: 不过我觉得可以采用类似 arp 协议的思路,应该挺简单(11:23)

mengwenguang对大家说: 那我过段日子去实现掉(11:24)

winux对大家说: goer的负载均衡处理如何?(11:25)

mengwenguang对大家说: goer只负责消息的传送,应该不涉及负载均衡(11:26)
mengwenguang对大家说: 如果用于联机事务处理,可以有下面的解决方案(11:27)
mengwenguang对大家说: 如 pa程序处理 m1类型的消息(理解成为业务请求)(11:28)
mengwenguang对大家说: 而且m1类型的请求很多(11:28)
mengwenguang对大家说: 那么可启动 多个pa进程,同时进行消息请求接收(11:28)
mengwenguang对大家说: 每个进程处理完一个消息请求后再去接收下一个(11:29)
mengwenguang对大家说: 对于 goer 来说,只进行消息的传递,不涉及事务处理,因此负荷肯定不大(11:30)
mengwenguang对大家说: 无法设想 网络消息 的负荷大到那种程度(11:30)

nkyu对mengwenguang说: 比如手机接发短信是属于网络消息么?(11:32)

orbat对mengwenguang说: 非常感谢你给我们提供这么多的信息,谢谢!(11:32)

winux对mengwenguang说: 当没有消息的接收者时,异步发送的消息怎样存储?(11:33)

allen_long对大家说: 大家看看还有什么问题要问mengwengguang的。感谢他为大家做得精彩讲解。(11:33)

nkyu对mengwenguang说: 蛮好的,了解更多了(11:33)

mengwenguang对大家说: 感谢各位提出建议,感谢allen_long,欢迎朋友和我交流(11:33)

mengwenguang对大家说: 手机接发短信属于网络消息(11:34)

nkyu对mengwenguang说: 我有事先走,以后再向大侠们请教(11:34)

allen_long对大家说: 下次我们组织一次Goddess的讨论,也请大家到时参加。mengwenguang你看什么时间方便就通知我(11:34)

orbat对mengwenguang说: 我很快要开始编写 jfoxms ,届时请多指教(11:35)

mengwenguang对大家说: 好的(11:35)

allen_long对大家说: winnx,我们也准备一次你的atcs的讨论,时间确定后就通知我。(11:35)

mengwenguang对大家说: 一起交流(11:35)

allen_long很高兴地对mengwenguang说: 再一次感谢你(11:36)

mengwenguang对大家说: 呵呵,太客气了(11:36)

allen_long很高兴地对winux说: winnx,我们也准备一次你的atcs的讨论,时间确定后就通知我。期待你的精彩讲解(11:36)

winux对大家说: 该吃饭了!感谢mengwenguang的讲解!(11:36)

allen_long很高兴地对大家说: 今天的讨论内容我会整理后发布到网上。(11:37)

mengwenguang对大家说: 下次再见,bye(11:38)

allen_long对大家说: 谢谢大家的参与(11:38)