Ray聊天记录

由于工作变动,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

好懵逼呀,客户端调用grainAddAmount,然后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

rabbitmqol扩展streams后只有500qps,单单测试rabbitmq1w 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

你的rabbitmqLinux上的吗

无名  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

olevent sourcing 

Evenstar  19:52:23

客户端查询的时候,我看Account里面有GetBalanceAccountRep里面也有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里面执行了flowtell又是在干嘛呢?

无名  20:13:33

把消息送达Flow

Evenstar  20:15:08

哦,那消息就是AccountAccountCoreHandlerAccountDbAccountFlow,是这么个流程哇?

无名  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

好懵逼呀,客户端调用grainAddAmount,然后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

rabbitmqol扩展streams后只有500qps,单单测试rabbitmq1w 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

你的rabbitmqLinux上的吗

无名  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

olevent sourcing 

Evenstar  19:52:23

客户端查询的时候,我看Account里面有GetBalanceAccountRep里面也有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里面执行了flowtell又是在干嘛呢?

无名  20:13:33

把消息送达Flow

Evenstar  20:15:08

哦,那消息就是AccountAccountCoreHandlerAccountDbAccountFlow,是这么个流程哇?

无名  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了吧?

 

猜你喜欢

转载自www.cnblogs.com/CharlesZHENG/p/9248946.html