public Future<integer> checkA(){
......
return new AsynResult...
}
就这种方法,假设有五六个,假定情景是它们用来检查一个用户是否有权限做某事,这五六个方法里只要有一个返回的结果是 0 (return new AsynResult<integer>(0)
),那么就知道不会继续往下走了,其它方法的返回结果可以不必再等,可以直接告诉用户你没权限,88 了您。
进一步地,如果要根据结果告知用户不同的被拦截服务的原因,比如checkA
返回-100,则告知用户:『大人,时待变了』,如果是checkB
返回-250,就告知用户:『澳门赌场开业了,性感荷官在线发牌』……当然,只要有一个方法表示通不过就立刻返回消息,其它检查方法结果不再重要。。
请问该如何实现呢?
谢谢!
1
shenlanAZ 2020-01-23 14:40:39 +08:00
我觉得你这个并发用的不对,权限应该在用户登录的时候查出来并缓存起来,后面用到权限控制的时候只需要看一下有没有对应权限即可。
|
2
Newyorkcity OP @shenlanAZ 额,这只是一个场景。。那我再换一个假设,比如说我主持一个论坛,一个坛友发帖,那我要审查他最近三分钟有没有发过贴,发帖的内容中是否有敏感词,发帖的格式是否正确这类的。。其中比如他发的内容里有没有敏感词,这我总不能预先知道吧
|
3
STRRL 2020-01-23 15:01:40 +08:00 via Android 1
reactor 库了解一下?
|
4
shenlanAZ 2020-01-23 15:05:53 +08:00 1
@Newyorkcity 最近有没有发过贴也可以利用缓存去判断,发帖有没有敏感词 格式是否正确这些用不着多线程,这些东西上多线程 会被你的 leader 骂过度优化。
如果你真的是想要并发取最先执行完毕的线程结果 你可以把结果放到外部的缓存里,在每个线程里都去判断这个结果存不存在,如果存在就放弃不管,如果不存在就存上去。当然 我这是业务思维。 |
5
Newyorkcity OP @shenlanAZ 谢谢解答,我没什么实际项目的开发经验,只是自己在自己学习的项目里想练习一下并发开发。
提炼一下的话就是一个业务执行前需要考察几个条件是否成立,这些条件之间互不相干,但只要任意一个不通过那业务就没必要执行。在这种情景下,一个一个条件串行地执行过去而不并发么? |
6
limuyan44 2020-01-23 16:32:46 +08:00 1
第一点,互不相关的校验也代表要一起验证,验证是需要代价的,这时候并行不意味着就比串行好到哪里去。第二点,你说的谁先有结果谁先返回可以尝试一下 CompletionService
|
7
aguesuka 2020-01-23 19:29:37 +08:00 via Android
楼主的意思是要实现一个 steam.anyMatch 的 aio 版吧, 优雅的办法我也不知道。
|
8
exceptionplayer1 2020-01-24 11:11:16 +08:00
CompletionService 可以。
|
9
exceptionplayer1 2020-01-24 11:16:25 +08:00 1
Java 提供了 CompletionService,同时可以参考[Dubbo 集群策略]( http://dubbo.apache.org/zh-cn/docs/user/demos/fault-tolerent-strategy.html)的实现,有一种策略为 Forking 策略,跟 CompletionService 很类似。
|