请教一个系统设计的问题

k
klabe
楼主 (未名空间)

我们有一个web application是帮助志愿者和医学研究人员互相匹配的,根据志愿者的
profile会自动提供合适的医学研究,根据医学研究的eligibility criteria会自动推
荐志愿者
每次志愿者修改profile或者研究修改eligibility criteria都会触发匹配,UI会block直到匹配结束,这个过程通常要很久,所以用户体验不是很好

现在希望可以每次修改后就自动返回页面,然后让匹配在后台自己执行,执行完以后给用户一个提示,但是有这样一些问题
1. 用户返回以后,当匹配还在执行的时候,是否给用户提供最新的推荐,还是等匹配
完成后再给推荐?如何实现这两种情况呢?
2. 用户可以多次提交修改,但是只想匹配一次,因为匹配会读取最新修改的数据进行
匹配

我们现在是一个monolithic的app,apache+tomcat,用的是spring+hibernate+redis+
oracle,没有用任何reactive的功能,是否应该考虑用spring webflux呢或者kafka?

谢谢了
m
magliner

我不懂啊, 为啥做个匹配会这么难 ? 临床方面的数据量按说应该很小啊,几千人了
不得了。怎么听起来这么难,那交友网站,婚介网站岂不是难上天了。
k
klabe

不是几千人,目前我们的系统有3万人,2000个研究
有一个大城市的机构要adopt,他们的目标是100万人和1万的研究
目前我们的匹配是用的fork join pool
【 在 magliner (magliner) 的大作中提到: 】
: 我不懂啊, 为啥做个匹配会这么难 ? 临床方面的数据量按说应该很小啊,几千人了
: 不得了。怎么听起来这么难,那交友网站,婚介网站岂不是难上天了。

h
hamsterdam4

spring @async controller?

【 在 klabe (klabe) 的大作中提到: 】
: 我们有一个web application是帮助志愿者和医学研究人员互相匹配的,根据志愿者的
: profile会自动提供合适的医学研究,根据医学研究的eligibility criteria会自动推
: 荐志愿者
: 每次志愿者修改profile或者研究修改eligibility criteria都会触发匹配,UI会
block
: 直到匹配结束,这个过程通常要很久,所以用户体验不是很好
: 现在希望可以每次修改后就自动返回页面,然后让匹配在后台自己执行,执行完以后给
: 用户一个提示,但是有这样一些问题
: 1. 用户返回以后,当匹配还在执行的时候,是否给用户提供最新的推荐,还是等匹配
: 完成后再给推荐?如何实现这两种情况呢?
: 2. 用户可以多次提交修改,但是只想匹配一次,因为匹配会读取最新修改的数据进行
: ...................

k
klabe

谢谢,但是如何不重复提交匹配请求呢?并且在匹配还在执行的时候或者等待执行的时候,在ui上提示用户匹配在执行,所以应该需要查询匹配对某一个用户是否在执行?
【 在 hamsterdam4 (蜜桃BB霜) 的大作中提到: 】
: spring @async controller?
: block

R
Reek


【 在 klabe (klabe) 的大作中提到: 】
: 谢谢,但是如何不重复提交匹配请求呢?并且在匹配还在执行的时候或者等待执行的时
: 候,在ui上提示用户匹配在执行,所以应该需要查询匹配对某一个用户是否在执行?

不重复提交请求在前端控制一下就行了,比如5分钟之内不能重复提交.
w
wicoo

可以试试这样设计:
1)UI发送的请求服务器立马返回,但是不返回查询结果,这样UI不会卡;
2)服务器跟UI之间维持一个socket连接,方便推送新的结果;
3)服务器为每个用户存储一个上次更新时间,以及上次查询状态位;
4)当收到志愿者请求,首先查询上次更新时间,如果小于设定时间间隔,则返回错误
,UI可以立马得知错误消息;如果大于设定时间间隔,但是上次查询尚未结束,返回错误,UI可以得知错误消息;如果大于设定时间间隔,并且上次查询已经结束,则启动新的查询;
5)研究院更新方法可以跟志愿者更新方法类似处理;
6)当服务器收到合理的请求时,启动新的匹配过程;当得到新的匹配结果,写入数据
库,并使用socket往用户界面推送结果,这样用户可以在更新数据之后逐渐收到匹配结果;
7)匹配结束时通知用户,如果匹配结果为空也通知用户;如果需要跟细节的进度,可
以实时更新用户查询进度条,当前查询了多少家研究院。
希望对你有帮助。

【 在 klabe (klabe) 的大作中提到: 】
: 我们有一个web application是帮助志愿者和医学研究人员互相匹配的,根据志愿者的
: profile会自动提供合适的医学研究,根据医学研究的eligibility criteria会自动推
: 荐志愿者
: 每次志愿者修改profile或者研究修改eligibility criteria都会触发匹配,UI会
block
: 直到匹配结束,这个过程通常要很久,所以用户体验不是很好
: 现在希望可以每次修改后就自动返回页面,然后让匹配在后台自己执行,执行完以后给
: 用户一个提示,但是有这样一些问题
: 1. 用户返回以后,当匹配还在执行的时候,是否给用户提供最新的推荐,还是等匹配
: 完成后再给推荐?如何实现这两种情况呢?
: 2. 用户可以多次提交修改,但是只想匹配一次,因为匹配会读取最新修改的数据进行
: ...................

a
aodeng

不使用队列(如celery,rabbitmq)的话,把匹配的活放到数据库里,单独做个
service或应用,定时检查数据库求并按照顺序运行匹配任务

w
walkrandom

spring这一套都是黑箱。
sometimes works, sometime not
没人知道怎么运作的。