看帖神器
未名空间
追帖动态
头条新闻
每日新帖
最新热帖
新闻存档
热帖存档
文学城
虎扑论坛
未名空间
北美华人网
北美微论坛
看帖神器
登录
← 下载
《看帖神器》官方
iOS App
,体验轻松追帖。
请教一个系统设计的问题
查看未名空间今日新帖
最新回复:2019年10月22日 8点55分 PT
共 (9) 楼
返回列表
订阅追帖
只看未读
更多选项
阅读全帖
只看图片
只看视频
查看原帖
k
klabe
4 年多
楼主 (未名空间)
我们有一个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
4 年多
2 楼
我不懂啊, 为啥做个匹配会这么难 ? 临床方面的数据量按说应该很小啊,几千人了
不得了。怎么听起来这么难,那交友网站,婚介网站岂不是难上天了。
k
klabe
4 年多
3 楼
不是几千人,目前我们的系统有3万人,2000个研究
有一个大城市的机构要adopt,他们的目标是100万人和1万的研究
目前我们的匹配是用的fork join pool
【 在 magliner (magliner) 的大作中提到: 】
: 我不懂啊, 为啥做个匹配会这么难 ? 临床方面的数据量按说应该很小啊,几千人了
: 不得了。怎么听起来这么难,那交友网站,婚介网站岂不是难上天了。
h
hamsterdam4
4 年多
4 楼
spring @async controller?
【 在 klabe (klabe) 的大作中提到: 】
: 我们有一个web application是帮助志愿者和医学研究人员互相匹配的,根据志愿者的
: profile会自动提供合适的医学研究,根据医学研究的eligibility criteria会自动推
: 荐志愿者
: 每次志愿者修改profile或者研究修改eligibility criteria都会触发匹配,UI会
block
: 直到匹配结束,这个过程通常要很久,所以用户体验不是很好
: 现在希望可以每次修改后就自动返回页面,然后让匹配在后台自己执行,执行完以后给
: 用户一个提示,但是有这样一些问题
: 1. 用户返回以后,当匹配还在执行的时候,是否给用户提供最新的推荐,还是等匹配
: 完成后再给推荐?如何实现这两种情况呢?
: 2. 用户可以多次提交修改,但是只想匹配一次,因为匹配会读取最新修改的数据进行
: ...................
k
klabe
4 年多
5 楼
谢谢,但是如何不重复提交匹配请求呢?并且在匹配还在执行的时候或者等待执行的时候,在ui上提示用户匹配在执行,所以应该需要查询匹配对某一个用户是否在执行?
【 在 hamsterdam4 (蜜桃BB霜) 的大作中提到: 】
: spring @async controller?
: block
R
Reek
4 年多
6 楼
【 在 klabe (klabe) 的大作中提到: 】
: 谢谢,但是如何不重复提交匹配请求呢?并且在匹配还在执行的时候或者等待执行的时
: 候,在ui上提示用户匹配在执行,所以应该需要查询匹配对某一个用户是否在执行?
不重复提交请求在前端控制一下就行了,比如5分钟之内不能重复提交.
w
wicoo
4 年多
7 楼
可以试试这样设计:
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
4 年多
8 楼
不使用队列(如celery,rabbitmq)的话,把匹配的活放到数据库里,单独做个
service或应用,定时检查数据库求并按照顺序运行匹配任务
w
walkrandom
4 年多
9 楼
spring这一套都是黑箱。
sometimes works, sometime not
没人知道怎么运作的。
请输入帖子链接
收藏帖子
我们有一个web application是帮助志愿者和医学研究人员互相匹配的,根据志愿者的
profile会自动提供合适的医学研究,根据医学研究的eligibility criteria会自动推
荐志愿者
每次志愿者修改profile或者研究修改eligibility criteria都会触发匹配,UI会block直到匹配结束,这个过程通常要很久,所以用户体验不是很好
现在希望可以每次修改后就自动返回页面,然后让匹配在后台自己执行,执行完以后给用户一个提示,但是有这样一些问题
1. 用户返回以后,当匹配还在执行的时候,是否给用户提供最新的推荐,还是等匹配
完成后再给推荐?如何实现这两种情况呢?
2. 用户可以多次提交修改,但是只想匹配一次,因为匹配会读取最新修改的数据进行
匹配
我们现在是一个monolithic的app,apache+tomcat,用的是spring+hibernate+redis+
oracle,没有用任何reactive的功能,是否应该考虑用spring webflux呢或者kafka?
谢谢了
我不懂啊, 为啥做个匹配会这么难 ? 临床方面的数据量按说应该很小啊,几千人了
不得了。怎么听起来这么难,那交友网站,婚介网站岂不是难上天了。
不是几千人,目前我们的系统有3万人,2000个研究
有一个大城市的机构要adopt,他们的目标是100万人和1万的研究
目前我们的匹配是用的fork join pool
【 在 magliner (magliner) 的大作中提到: 】
: 我不懂啊, 为啥做个匹配会这么难 ? 临床方面的数据量按说应该很小啊,几千人了
: 不得了。怎么听起来这么难,那交友网站,婚介网站岂不是难上天了。
spring @async controller?
【 在 klabe (klabe) 的大作中提到: 】
: 我们有一个web application是帮助志愿者和医学研究人员互相匹配的,根据志愿者的
: profile会自动提供合适的医学研究,根据医学研究的eligibility criteria会自动推
: 荐志愿者
: 每次志愿者修改profile或者研究修改eligibility criteria都会触发匹配,UI会
block
: 直到匹配结束,这个过程通常要很久,所以用户体验不是很好
: 现在希望可以每次修改后就自动返回页面,然后让匹配在后台自己执行,执行完以后给
: 用户一个提示,但是有这样一些问题
: 1. 用户返回以后,当匹配还在执行的时候,是否给用户提供最新的推荐,还是等匹配
: 完成后再给推荐?如何实现这两种情况呢?
: 2. 用户可以多次提交修改,但是只想匹配一次,因为匹配会读取最新修改的数据进行
: ...................
谢谢,但是如何不重复提交匹配请求呢?并且在匹配还在执行的时候或者等待执行的时候,在ui上提示用户匹配在执行,所以应该需要查询匹配对某一个用户是否在执行?
【 在 hamsterdam4 (蜜桃BB霜) 的大作中提到: 】
: spring @async controller?
: block
【 在 klabe (klabe) 的大作中提到: 】
: 谢谢,但是如何不重复提交匹配请求呢?并且在匹配还在执行的时候或者等待执行的时
: 候,在ui上提示用户匹配在执行,所以应该需要查询匹配对某一个用户是否在执行?
不重复提交请求在前端控制一下就行了,比如5分钟之内不能重复提交.
可以试试这样设计:
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. 用户可以多次提交修改,但是只想匹配一次,因为匹配会读取最新修改的数据进行
: ...................
不使用队列(如celery,rabbitmq)的话,把匹配的活放到数据库里,单独做个
service或应用,定时检查数据库求并按照顺序运行匹配任务
spring这一套都是黑箱。
sometimes works, sometime not
没人知道怎么运作的。