【问题标题】:Creating entities using task queues do not always get created使用任务队列创建实体并不总是被创建
【发布时间】:2013-07-12 18:33:11
【问题描述】:

我有一个任务,它只是在数据存储中创建一个实体。我现在将许多任务排队到一个命名的推送队列中并让它运行。完成后,我在日志中看到所有任务请求都已运行。但是,创建的实体数量实际上低于预期。

以下是我用来测试的代码示例。我运行了 10000 个任务,最终结果数据存储区中只有大约 9200 个实体。

我使用 RestEasy 公开任务队列的 url。

queue.xml

<queue>
    <name>testQueue</name>
    <rate>5/s</rate>
</queue>

测试代码

@GET
@Path("/queuetest/{numTimes}")
public void queueTest(@PathParam("numTimes") int numTimes) {
    for(int i = 1; i <= numTimes; i++) {
        Queue queue = QueueFactory.getQueue("testQueue");
        TaskOptions taskOptions = TaskOptions.Builder.withUrl("/queuetest/worker/" + i).method(Method.GET);
        queue.add(taskOptions);
    }
}

@GET
@Path("/queuetest/worker/{index}")
public void queueTestWorker(@PathParam("index") String index) {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    Date today = Calendar.getInstance().getTime();        
    String timestamp = df.format(today);

    Entity tObj = new Entity("TestObj");
    tObj.setProperty("identifier", index);
    tObj.setProperty("timestamp", timestamp);

    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Key key = datastore.put(tObj);
}

我已经运行了几次,但没有一次看到所有创建的实体。

如果队列上的争用过多,是否有可能丢弃任务? 这是任务队列的预期行为吗?

#### 编辑

我按照 mitch 的建议记录了创建的实体 ID,发现它们确实是按预期创建的。但是日志本身显示了一些奇怪的行为,其中来自某些任务的日志出现在另一个任务的日志中。发生这种情况时,某些任务会在单个请求中显示 2 个实体 ID。

对于显示 2 个实体 ID 的任务,它记录的第一个是数据存储中缺失的实体。这是否意味着对数据存储的大量放置存在问题? (我创建的实体不是更大实体组的一部分,即它不引用@parent)

【问题讨论】:

  • 您的应用程序是否在线程池中用尽线程并丢弃传入连接?
  • 是多个任务创建相同的数据存储条目并相互覆盖。
  • 哪些索引丢失了?最后全部?随机分散?成群结队?时间戳也是如此。
  • @ColinMorelli 可能是这个,但我不知道如何检查这个,可以指出任何有关此的文档吗?谢谢
  • @LeeMeador 每个任务每次都应该创建一个全新的实体,因为我使用 DatastoreService 的 put 方法而不传递密钥。

标签: java google-app-engine task-queue


【解决方案1】:

为什么不在每个 datastore.put() 调用之后添加一条日志语句,用于记录新创建实体的 ID。然后您可以将日志与数据存储内容进行比较,您将能够判断问题是否是 datastore.put() 没有被成功调用 1000 次,或者问题是否是某些成功的 put 调用没有导致您在数据存储区中看到的实体。

【讨论】:

  • 我这样做了,我得到了一些奇怪的行为。我查看了所有请求,其中一些工作正常。但是有些请求记录了 2 个不同的实体 ID,有些请求根本没有记录任何内容。因此,日志语句似乎以某种方式打印在另一个请求中,而不是它本身。因此,在少数 20 个实体上运行此程序并看到 20 个不同的 ID,但实际上只创建了 18 个实体。 puts 是否存在一些数据存储并发问题?
猜你喜欢
  • 2018-03-22
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多