美文网首页
跨网络域分布式任务解决

跨网络域分布式任务解决

作者: 李不言被占用了 | 来源:发表于2018-10-18 11:18 被阅读24次

    问题引出

    让我们先回到一年级,那个时候虽然我们是熊孩子,可是老师总有办法骗我们,让我们乖乖地搞卫生!假设这样一种场景:老师发了一个任务清单如下:

    搞卫生任务:
      扫地:张三
      拖地:李四
      洗厕所:王五  #  嗯,看起来王五有点惨
    

    显然每个人都知道自己要干什么事情。

    如果老师给你的任务清单是这样的:

    搞卫生任务:
      扫地: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。

    总结

    系统建设过程中看似复杂的问题,其实都能找到很多解决方案,而这些解决方案可能就来源于生活,总有一款适合你!

    本文地址,转载请说明,喜欢请点赞

    相关文章

      网友评论

          本文标题:跨网络域分布式任务解决

          本文链接:https://www.haomeiwen.com/subject/weqjzftx.html