首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟分布式系统的最佳方法?

模拟分布式系统的最佳方法?
EN

Stack Overflow用户
提问于 2022-01-19 16:58:30
回答 1查看 105关注 0票数 1

我正在构建一个分布式系统,在这个系统中,我将拥有大约30000个相互交互的模块。每个模块都有相同软件的副本,并与邻居进行通信以执行某些任务。我想模拟这个,但是模拟架构有问题。我目前的方法是为每个模块创建一个线程,这样每个模块就可以异步运行,但是旋转30000个线程似乎不是一个现实的解决方案。任何关于如何模拟30,000个分布式模块的想法或方向都是有帮助的。

EN

回答 1

Stack Overflow用户

发布于 2022-01-20 21:29:01

我的团队为我们的分布式系统使用了一个自制的模拟环境。我们主要使用它来模拟单元测试框架中的交互(非常适合回归测试!),但也可以用于长期的模拟。

以下是主要部分:

  • 模拟网络和时钟的库。这个库允许我们以编程方式停止“时钟”或“网络”,并逐步通过任何一种方法。网络还具有阻止destinations.
  • Components与事件驱动的流量的钩子.它们基本上要么是带有邮箱的参与者,要么是执行队列(比如java的ExecutorService)。我们不使用参与者框架,也不使用光纤线程框架。在单元测试中,我们更希望这些测试是单线程的,但是对于模拟,我们使用一个线程池来运行整个程序。

我们使用依赖注入来交换真实的网络/时钟/线程和模拟的网络/时钟/线程。(我们通常将它们捆绑在一个Environment接口中。)

下面是使用Paxos的环境的一个玩具示例:

代码语言:javascript
复制
@Test
public void paxosExample() throws Exception {
    
    // create a simulator, then, in the commented section below, log the trace someplace for later perusal
    Network network = Network.simple();

    // Uncomment this to log the network trace to a file which can be very useful for debugging.
    // network.traceToFile( TRACEFILE );
    // log.info( "check out the trace file ", "filename", TRACEFILE );
    
    // create the Paxonians
    List<Paxonian> paxonians = IntStream.range(0, N)
        .mapToObject(i -> {
            SimNic nic = network.provisionNic( Paxosian.NIC_NAME_PREFIX );
            return new Paxosian(nic, VALUES[i]);
        })
        .collect(Collectors.toList());
    
    // start the protocol.
    for (Paxosian p : paxosians) {
        p.start();
    }

    log.info("here we go");
    network.stepRecursive( StepSelector.RANDOM );

    Paxonian first = paxonians.get(0);
    assertNotNull( first.getDecision() );
    for (Paxosian p : paxosians) {
        assertEquals(first.getDecision(), p.getDecision());
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70774704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档