由于工作变动,Ray的文档、示例没有及时更新,深表歉意。在Ray升级后,性能较几个月前有了非常大的提升,也更具易用性。这是QQ交流群里大家的聊天记录,跟大家分享一下(由于时间仓促群里大家的聊天记录没有整理,请见谅)。
-----
Evenstar 17:45:57
demo里面业务数据存到哪儿去了呢?真实项目中应该在什么地方进行业务数据的读写呢
无名 18:05:17
在这里写插入数据库的操作
无名 18:05:23
@Evenstar
Evenstar 18:08:47
我现在有一套基于mysql的业务数据库,如果想要用ray来进行改造,业务数据还是存在原数据库里面,那mongodb又是拿来干嘛的呢?
无名 18:09:12
存事件
无名 18:09:30
内存状态变动的事件
Evenstar 18:09:49
用于灾后恢复?
无名 18:11:33
你可以先了解下Event Sourcing的概念
Evenstar 18:17:06
我大概看了以下概念,就是不知道真实项目中哪些应该定义为事件,比如我原来业务系统中有一套报警处理流程的业务,报警发生后,先被人接收了,后来他上传给了其他人,其他人又处理了,这个感觉有点像事件溯源里面描述的场景,那我是应该把这些处理流程定义为事件么?我原来mysql业务系统里面专门有一张表来存储这些变更过程,定义为事件存储到mongodb以后,原来的mysql业务数据库里面流程表还需要存储么?
Evenstar 18:17:53
最新的代码要装core 2.1哇?
、陈依(470923079) 18:36:44
什么时候完善下文档之类的。
、陈依(470923079) 18:36:57
来个稳定的生产版本
无名 18:37:59 我已经用在生产环境了 |
Evenstar 18:46:54
客户端里面这几句具体是干嘛呢?起什么作用 |
无名 18:50:53 启用消息队列监听 |
Evenstar 18:55:43 监听服务器pub的消息哇?监听消息的回调函数呢?或者说监听消息的输出在哪儿呢 |
无名 19:00:01 在Handle里 |
Evenstar 19:05:45
这里么?这里又远程调用服务器的grain,是触发OnEventDelivered这个方法? |
Evenstar 19:19:45 好懵逼呀,客户端调用grain的AddAmount,然后grain调用RaiseEvent发布事件,然后这个事件到AccountDb这个的Process了? |
无名 19:30:06
|
无名 19:30:40 @Evenstar 这3个都会收到事件消息 |
无名 19:31:06 Db同步到数据库,Flow处理后续的业务逻辑,Rep提供副本功能 |
Evenstar 19:34:21 Db是做自己的业务数据持久化,Flow里面如果是充值,那就不必做处理,如果是转账AccountDb里面只是把原账户金额减了,Flow里面来做目标账户的金额增加操作? |
夜夜 19:37:10 你好,无名。 |
无名 19:37:43 是的 |
无名 19:37:50 @夜夜 好啊 |
夜夜 19:38:02 我rabbitmq和ol扩展streams后只有500qps,单单测试rabbitmq有1w qps |
Evenstar 19:38:43 为什么不是直接在原账户的grain实例里面激活目标账户的grain直接增加金额呢?这么设计的目的是什么呀 |
无名 19:38:47 姿势不对 |
无名 19:39:14 @Evenstar 如果A减了金额,突然断电,B的金额没有增加呢? |
夜夜 19:39:43 完全参考Azure Queues写的啊 |
无名 19:40:27 @夜夜 我自己的框架,一秒钟几万qps |
Evenstar 19:40:32 这个设计如何避免这种情况的发生呢? |
无名 19:40:34 也是rabbitmq |
无名 19:41:07 @Evenstar 最终一致性,只要A执行成功,那么消息一定会流转到flow里面 |
无名 19:41:18 然后操作B |
夜夜 19:41:24 你的rabbitmq是Linux上的吗 |
无名 19:41:32 嗯 |
夜夜 19:42:43 我现在是一脸懵逼,单单 |
Evenstar 19:43:13 是A执行成功以后,消息才会到flow? |
无名 19:43:21 是的 |
Evenstar 19:43:46 那A执行成功以后,断电了,系统重启以后,flow还能收到这个消息? |
无名 19:44:05 能啊 |
夜夜 19:44:45 memory的 streams也不是很快 在我的i5四核上,才2000qps.严重怀疑姿势不对 |
Evenstar 19:45:18 是消息队列对消息的可靠保障提供的功劳哇? |
无名 19:45:27 我不用stream的 |
夜夜 19:45:30 用的官方文档的隐式订阅 |
无名 19:45:44 不依赖消息队列,依赖事件版本号 |
Evenstar 19:46:44 哦,因为事件已经到mongodb做了持久化,所有重启以后flow还能收到消息? |
夜夜 19:47:10 溯源 |
夜夜 19:47:20 首次启动的时候 |
无名 19:47:52 我的框架现在性能已经非常牛了 |
夜夜 19:47:55 stream |
夜夜 19:48:03 我也不打算用了 |
夜夜 19:48:23 搞不定 |
Evenstar 19:49:14 好吧,先不纠结这个可靠性了,AccountRep这个副本收到事件消息又干嘛了呢 |
无名 19:50:16 这个正常用不到,这个是读写分离用的 |
夜夜 19:50:16 测试了好几天了。一开始rabbitmq没升级到预览版,一到创建链接就报地址错误,我都开始慌了 |
无名 19:50:32 Account提供写入,AccountRep提供查询 |
夜夜 19:51:27 大佬的框架我也研究了,很给力 |
夜夜 19:52:16 ol的event sourcing |
Evenstar 19:52:23 客户端查询的时候,我看Account里面有GetBalance,AccountRep里面也有GetBalance,什么机制导致客户端会调用到AccountRep里面的方法呢? |
夜夜 19:52:47 实现,只提供了两个接口,一个read 一个write |
无名 19:53:15 @Evenstar 手动控制啊 |
无名 19:53:26 这个业务逻辑要手动精确控制的 |
Evenstar 19:53:26 rep收事件消息是为了同步Account里面的数据哇? |
无名 19:53:34 是啊 |
夜夜 19:54:04 也可以避免单个grain压力太大 |
无名 19:54:46 我考虑的应用场景很多的 |
Evenstar 19:54:46
这个地方我看还是直接调用的Account实例,实例里面是通过AlwaysInterleave这个属性来控制这个请求去副本调用么? |
无名 19:55:17 这里没有用到Rep |
无名 19:55:32 我只是写个例子,告诉可以进行读写分离操作 |
Evenstar 19:56:12
哦,那如果要用,是在客户端直接实例化rep实例去调用GetBalance?客户端来做这个精准控制?
无名 19:57:07
嗯
Evenstar 19:57:53
事件持久化不需要写代码来控制,只要注册了,就自动处理了么
夜夜 19:58:10
MongoDb写入性能怎么样,我用sqlserver qps只有1000
夜夜 19:58:39
我也是转账实例
夜夜 19:59:11
就是多加了个判断余额够不够
Evenstar 19:59:25
AlwaysInterleave 这个属性是干嘛的呀?
无名 19:59:44
你用的事务啊?
无名 19:59:58
我的事件插入,一秒钟插入十几万
无名 20:00:16
我用的postgresql
夜夜 20:00:30
你是批量吗
无名 20:01:26
事件不是批量的
无名 20:01:30
没法批量
Evenstar 20:02:57
整个流程里面,客户端注册这个是干嘛的呀?帮忙解答一下,感觉快理顺了
夜夜 20:05:25
是啊,难道是连接打开关闭上耗了性能?
无名 20:05:29
消息流转和做额外处理的
无名 20:05:59
比如转账了,可以在这里的LocalProcess里面发短信
无名 20:06:24
@夜夜 连接池无所谓的
夜夜 20:06:59
sqlserver性能也不至于这么差吧
夜夜 20:07:11
感觉又是姿势不对
无名 20:07:21
你可以装个postgresql试试
Evenstar 20:08:01
在demo里面,服务器充值了,是服务器的AccountDb执行了AmountAddEventHandler事件以后,AccountCoreHandler才接收到消息?
夜夜 20:08:20
明天试试装个pg
夜夜 20:08:40
也是linux的吗
无名 20:08:42
@Evenstar 先到handler再到DB
无名 20:08:49
嗯
Evenstar 20:12:57
demo里面并没有做LocalProcess的实现,而是在SendToAsyncGrain里面执行了flow的tell又是在干嘛呢?
无名 20:13:33
把消息送达Flow
Evenstar 20:15:08
哦,那消息就是Account》AccountCoreHandler》AccountDb》AccountFlow,是这么个流程哇?
无名 20:16:55
Db,Flow一起执行的
Evenstar 20:23:18
其他流程大概清楚了,就这个AccountCoreHandler始终还是没明白,主要用于什么,是服务器做了操作通过mq来通知客户端么
无名 20:23:42
通过MQ来流转消息
Evenstar 20:24:08
为什么要到客户端来跑一圈来通知flow呢
Evenstar 20:32:45
@无名 谢谢大神的耐心解答,我觉得整个流程不写清楚,新手很难上手,看demo看不明白为什么要这样做,目的是什么,一个开源项目能不能活跃起来,新人很重要,大神对开源的东西好多都只看不用
无名 20:36:53
主要现在比较忙
无名 20:36:58
没空写文档
Evenstar 21:01:57
这安装不上咋回事呢
Evenstar 21:18:06
环境都安装好了,下周先摸索一下,谢谢@无名 指导了哈,以后有问题还要麻烦大神
Evenstar 22:39:57
@无名 睡了吗?再麻烦一下,我现在改造现有系统,第一步是将客户端大量的查询业务转移过来,只有很少量的数据写入操作,这种情况下,可能事件溯源主要用来记录客户端的操作日志,应该就不需要客户端注册mq了吧?
--
Ray框架交流QQ群:713485689
Evenstar 17:45:57
demo里面业务数据存到哪儿去了呢?真实项目中应该在什么地方进行业务数据的读写呢
无名 18:05:17
在这里写插入数据库的操作
无名 18:05:23
@Evenstar
Evenstar 18:08:47
我现在有一套基于mysql的业务数据库,如果想要用ray来进行改造,业务数据还是存在原数据库里面,那mongodb又是拿来干嘛的呢?
无名 18:09:12
存事件
无名 18:09:30
内存状态变动的事件
Evenstar 18:09:49
用于灾后恢复?
无名 18:11:33
你可以先了解下Event Sourcing的概念
Evenstar 18:17:06
我大概看了以下概念,就是不知道真实项目中哪些应该定义为事件,比如我原来业务系统中有一套报警处理流程的业务,报警发生后,先被人接收了,后来他上传给了其他人,其他人又处理了,这个感觉有点像事件溯源里面描述的场景,那我是应该把这些处理流程定义为事件么?我原来mysql业务系统里面专门有一张表来存储这些变更过程,定义为事件存储到mongodb以后,原来的mysql业务数据库里面流程表还需要存储么?
Evenstar 18:17:53
最新的代码要装core 2.1哇?
、陈依(470923079) 18:36:44
什么时候完善下文档之类的。
、陈依(470923079) 18:36:57
来个稳定的生产版本
无名 18:37:59 我已经用在生产环境了 |
Evenstar 18:46:54
客户端里面这几句具体是干嘛呢?起什么作用 |
无名 18:50:53 启用消息队列监听 |
Evenstar 18:55:43 监听服务器pub的消息哇?监听消息的回调函数呢?或者说监听消息的输出在哪儿呢 |
无名 19:00:01 在Handle里 |
Evenstar 19:05:45
这里么?这里又远程调用服务器的grain,是触发OnEventDelivered这个方法? |
Evenstar 19:19:45 好懵逼呀,客户端调用grain的AddAmount,然后grain调用RaiseEvent发布事件,然后这个事件到AccountDb这个的Process了? |
无名 19:30:06
|
无名 19:30:40 @Evenstar 这3个都会收到事件消息 |
无名 19:31:06 Db同步到数据库,Flow处理后续的业务逻辑,Rep提供副本功能 |
Evenstar 19:34:21 Db是做自己的业务数据持久化,Flow里面如果是充值,那就不必做处理,如果是转账AccountDb里面只是把原账户金额减了,Flow里面来做目标账户的金额增加操作? |
夜夜 19:37:10 你好,无名。 |
无名 19:37:43 是的 |
无名 19:37:50 @夜夜 好啊 |
夜夜 19:38:02 我rabbitmq和ol扩展streams后只有500qps,单单测试rabbitmq有1w qps |
Evenstar 19:38:43 为什么不是直接在原账户的grain实例里面激活目标账户的grain直接增加金额呢?这么设计的目的是什么呀 |
无名 19:38:47 姿势不对 |
无名 19:39:14 @Evenstar 如果A减了金额,突然断电,B的金额没有增加呢? |
夜夜 19:39:43 完全参考Azure Queues写的啊 |
无名 19:40:27 @夜夜 我自己的框架,一秒钟几万qps |
Evenstar 19:40:32 这个设计如何避免这种情况的发生呢? |
无名 19:40:34 也是rabbitmq |
无名 19:41:07 @Evenstar 最终一致性,只要A执行成功,那么消息一定会流转到flow里面 |
无名 19:41:18 然后操作B |
夜夜 19:41:24 你的rabbitmq是Linux上的吗 |
无名 19:41:32 嗯 |
夜夜 19:42:43 我现在是一脸懵逼,单单 |
Evenstar 19:43:13 是A执行成功以后,消息才会到flow? |
无名 19:43:21 是的 |
Evenstar 19:43:46 那A执行成功以后,断电了,系统重启以后,flow还能收到这个消息? |
无名 19:44:05 能啊 |
夜夜 19:44:45 memory的 streams也不是很快 在我的i5四核上,才2000qps.严重怀疑姿势不对 |
Evenstar 19:45:18 是消息队列对消息的可靠保障提供的功劳哇? |
无名 19:45:27 我不用stream的 |
夜夜 19:45:30 用的官方文档的隐式订阅 |
无名 19:45:44 不依赖消息队列,依赖事件版本号 |
Evenstar 19:46:44 哦,因为事件已经到mongodb做了持久化,所有重启以后flow还能收到消息? |
夜夜 19:47:10 溯源 |
夜夜 19:47:20 首次启动的时候 |
无名 19:47:52 我的框架现在性能已经非常牛了 |
夜夜 19:47:55 stream |
夜夜 19:48:03 我也不打算用了 |
夜夜 19:48:23 搞不定 |
Evenstar 19:49:14 好吧,先不纠结这个可靠性了,AccountRep这个副本收到事件消息又干嘛了呢 |
无名 19:50:16 这个正常用不到,这个是读写分离用的 |
夜夜 19:50:16 测试了好几天了。一开始rabbitmq没升级到预览版,一到创建链接就报地址错误,我都开始慌了 |
无名 19:50:32 Account提供写入,AccountRep提供查询 |
夜夜 19:51:27 大佬的框架我也研究了,很给力 |
夜夜 19:52:16 ol的event sourcing |
Evenstar 19:52:23 客户端查询的时候,我看Account里面有GetBalance,AccountRep里面也有GetBalance,什么机制导致客户端会调用到AccountRep里面的方法呢? |
夜夜 19:52:47 实现,只提供了两个接口,一个read 一个write |
无名 19:53:15 @Evenstar 手动控制啊 |
无名 19:53:26 这个业务逻辑要手动精确控制的 |
Evenstar 19:53:26 rep收事件消息是为了同步Account里面的数据哇? |
无名 19:53:34 是啊 |
夜夜 19:54:04 也可以避免单个grain压力太大 |
无名 19:54:46 我考虑的应用场景很多的 |
Evenstar 19:54:46
这个地方我看还是直接调用的Account实例,实例里面是通过AlwaysInterleave这个属性来控制这个请求去副本调用么? |
无名 19:55:17 这里没有用到Rep |
无名 19:55:32 我只是写个例子,告诉可以进行读写分离操作 |
Evenstar 19:56:12
哦,那如果要用,是在客户端直接实例化rep实例去调用GetBalance?客户端来做这个精准控制?
无名 19:57:07
嗯
Evenstar 19:57:53
事件持久化不需要写代码来控制,只要注册了,就自动处理了么
夜夜 19:58:10
MongoDb写入性能怎么样,我用sqlserver qps只有1000
夜夜 19:58:39
我也是转账实例
夜夜 19:59:11
就是多加了个判断余额够不够
Evenstar 19:59:25
AlwaysInterleave 这个属性是干嘛的呀?
无名 19:59:44
你用的事务啊?
无名 19:59:58
我的事件插入,一秒钟插入十几万
无名 20:00:16
我用的postgresql
夜夜 20:00:30
你是批量吗
无名 20:01:26
事件不是批量的
无名 20:01:30
没法批量
Evenstar 20:02:57
整个流程里面,客户端注册这个是干嘛的呀?帮忙解答一下,感觉快理顺了
夜夜 20:05:25
是啊,难道是连接打开关闭上耗了性能?
无名 20:05:29
消息流转和做额外处理的
无名 20:05:59
比如转账了,可以在这里的LocalProcess里面发短信
无名 20:06:24
@夜夜 连接池无所谓的
夜夜 20:06:59
sqlserver性能也不至于这么差吧
夜夜 20:07:11
感觉又是姿势不对
无名 20:07:21
你可以装个postgresql试试
Evenstar 20:08:01
在demo里面,服务器充值了,是服务器的AccountDb执行了AmountAddEventHandler事件以后,AccountCoreHandler才接收到消息?
夜夜 20:08:20
明天试试装个pg
夜夜 20:08:40
也是linux的吗
无名 20:08:42
@Evenstar 先到handler再到DB
无名 20:08:49
嗯
Evenstar 20:12:57
demo里面并没有做LocalProcess的实现,而是在SendToAsyncGrain里面执行了flow的tell又是在干嘛呢?
无名 20:13:33
把消息送达Flow
Evenstar 20:15:08
哦,那消息就是Account》AccountCoreHandler》AccountDb》AccountFlow,是这么个流程哇?
无名 20:16:55
Db,Flow一起执行的
Evenstar 20:23:18
其他流程大概清楚了,就这个AccountCoreHandler始终还是没明白,主要用于什么,是服务器做了操作通过mq来通知客户端么
无名 20:23:42
通过MQ来流转消息
Evenstar 20:24:08
为什么要到客户端来跑一圈来通知flow呢
Evenstar 20:32:45
@无名 谢谢大神的耐心解答,我觉得整个流程不写清楚,新手很难上手,看demo看不明白为什么要这样做,目的是什么,一个开源项目能不能活跃起来,新人很重要,大神对开源的东西好多都只看不用
无名 20:36:53
主要现在比较忙
无名 20:36:58
没空写文档
Evenstar 21:01:57
这安装不上咋回事呢
Evenstar 21:18:06
环境都安装好了,下周先摸索一下,谢谢@无名 指导了哈,以后有问题还要麻烦大神
Evenstar 22:39:57
@无名 睡了吗?再麻烦一下,我现在改造现有系统,第一步是将客户端大量的查询业务转移过来,只有很少量的数据写入操作,这种情况下,可能事件溯源主要用来记录客户端的操作日志,应该就不需要客户端注册mq了吧?