最终的一致性和测试用例

ltf*_*hie 6 unit-testing mongodb nosql

在处理像MongoDB这样的最终一致的数据存储时编写测试用例的最佳实践是什么?

我目前的设置是Mongodb,它具有3节点主/从/从设置,slave-ok设置为true.这意味着主节点用于只写,两个从节点用于只读.

数据在从站上保持一致所用的时间相对较短,并且取决于操作和数据大小.例如,删除操作约3毫秒,1000个对象批量插入约200毫秒.

我的目标是测试我的Dao上的操作.它们可能很简单,如getById,delete,insert或findByExample等复杂的.我需要验证它们是否正常工作,最终在一些超时限制内是否可以接受.

这是我目前测试删除操作的内容,例如:

  @Test
  public void deleteTest() throws InstantiationException,
              IllegalAccessException {
        MyObject obj = new MyObject();
        obj.setName("test object");
        obj.save(obj);
        MyObject found = dao.findById(obj.getId());
        logger.info ("before: " + found);
        Assert.assertEquals(obj, found);

        dao.delete(obj.getId());
        MyObject deleted = null;
        long start = System.nanoTime();
        do {
              //TBD: need to add escape condition/timeout, else may be infinite loop....
              deleted = dao.findById(obj.getId());
              logger.info ("While: " + deleted);
        } while (deleted!=null);
        logger.info("It took " + ((System.nanoTime()-start)/1000000.00) + " ms for delete to be consistent");
        Assert.assertEquals(null, d1);
  } 
Run Code Online (Sandbox Code Playgroud)

Mat*_*own 2

我想到了几个想法

  1. 在生产中,如果您准备好从从设备,您将永远不知道是否正在获取最新数据。这就是 MongoDB 中读从属的权衡。我的经验是,在正常工作条件下,奴隶是最新的。如果您必须获取最新数据,请查询master。
  2. 我肯定会开始使用彩信来跟踪您的副本滞后。这将告诉您您的从属设备落后多远,以便您可以了解数据可用的速度
  3. 至于最初的测试问题,取决于你的目标。无论是副本还是独立的,您的 DAO 都应该能够读取和写入相同的数据。您只需要确保您的应用程序了解它查询的数据可能不是最新的数据。