问题引出
让我们先回到一年级,那个时候虽然我们是熊孩子,可是老师总有办法骗我们,让我们乖乖地搞卫生!假设这样一种场景:老师发了一个任务清单如下:
搞卫生任务:
扫地:张三
拖地:李四
洗厕所:王五 # 嗯,看起来王五有点惨
显然每个人都知道自己要干什么事情。
如果老师给你的任务清单是这样的:
搞卫生任务:
扫地:A
拖地:A
洗厕所: B
请问王五同学,你知道洗厕所的人是你吗?显然你还懵逼中:谁是A谁是B啊?每个人都不希望自己是B。
但是如果老师给出的是这样的清单:
发给李四的是这样的:
你是A
搞卫生任务:
扫地:A
拖地:A
洗厕所: B
发给王五的是这样的:
你是B
搞卫生任务:
扫地:A
拖地:A
洗厕所: B
那显然李四知道自己要扫地、拖地,王五知道,洗厕所那个悲剧是自己。
背景
业务系统划分了网络域,不同域之间网络可能不互通,如图所示:
简单网络域示意
说明: A与B之间不能互通。
问题
现在的业务场景是这样的,需要在A和B两个域部署应用,负责将这两个域的文件下载并上传到C域中。希望a1和a2接收参数时能知道去哪个域下载文件。配置如下:
a.todoList:
downloadPath1:xxx
downloadPath2:xxx
downloadPath3:xxx
由于a1和a2是同一套代码,它们都是无状态的,他们的任务配置都来自于调度引擎,你让我干嘛我就干嘛。他们都会解析a.todoList里的所有downloadPath*。假设downloadPath1和downloadPath2在A域,downloadPath3在B域,显然a1在下载downloadPath3的时候会出错。
现在的问题就是,怎样保证a1/a2只会处理a.todoList里特定的downloadPath(因为他们是一样的代码,他们都会处理a.todoList这个配置)。
解决方案
回到现实中的例子,如果我告诉了a1:你在A域,你要处理downloadPath1和downloadPath2;告诉a2:你在B域,你要处理downloadPath3。显然就不会出现上面的问题了。
于是乎有了这样一份配置:
a.todoList:
zoneA:
downloadPath1:xxx
downloadPath2:xxx
zoneB:
downloadPath3:xxx
这样,我让a1就知道处理zoneA里面的downloadPath1和downloadPath2,a2就只会处理zoneB里面的downloadPath3。
总结
系统建设过程中看似复杂的问题,其实都能找到很多解决方案,而这些解决方案可能就来源于生活,总有一款适合你!
网友评论