如何在Google App Engine / Google Data Store(JDO)中实现消息队列

时间:2014-07-02 12:09:42

标签: google-app-engine jdo google-cloud-datastore

我想为部署在Google App Engine中的应用程序实现消息Queue(F.I.F.O)。该应用程序使用JDO访问Google DataStore。我公开了一个可以从任何移动设备调用的REST API。下图应该清楚地表明我想要实现的目标。

enter image description here

移动设备池调用REST API以将消息入队到队列中。 Message实体包含创建时间戳和消息状态字段。消息状态最初设置为ACTIVE。另一个移动设备池将调用REST API来获取消息。此时,查询数据存储区以查找以创建时间戳的升序排序的ACTIVE消息。然后将消息状态设置为DELIVERED,并将消息返回给设备。

然后是来自消费者设备的并​​发请求时出现问题。多个设备接收相同的消息。

我有一个模型类消息

@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
private String id;
@Persistent
private String message;
@Persistent
private Date created;
@Persistent
private MessageStatus status;

MessageStatus枚举具有以下雕像

    public enum MessageStatus {
    ACTIVE, DELIVERED, ACKNOWLEDGED
}

我有一个数据访问类MessageDAO

public Message fetchMessage() {
        PersistenceManager pm = PMF.get().getPersistenceManager();
        Message message = null;
        Transaction transaction = null;
        try {
            transaction = pm.currentTransaction();
            transaction.setIsolationLevel(Constants.TX_READ_COMMITTED);
            transaction.begin();            

            Query query = pm.newQuery(Message.class);           
            query.setFilter("status == 'ACTIVE'");          
            query.setOrdering("created asc");


            List<Message> messageList = (List<Message>) query.execute();            
            if (messageList != null && !messageList.isEmpty()) {
                message = messageList.get(0);
                message.setStatus(MessageStatus.DELIVERED);             
            }

            transaction.commit();
        } finally {
            if (transaction != null && transaction.isActive()) {
                transaction.rollback();
            }

            pm.close();
        }
        return message;
    }

1 个答案:

答案 0 :(得分:0)

您似乎长时间轮询来自设备的消息。如果是这种情况,那么使用任务队列就没有任何实际价值。队列更适用于要执行的作业/业务处理。

您应该只拥有端点,并使用您拥有的最后一条消息的时间戳来调用服务器。然后,每个设备都将从数据存储区中的查询中检索完全相同的结果集。 Memcache将帮助配额。

您可以参考Dropbox的用途,他们使用他们发送的增量令牌来接收一组任何新的文件夹/文件更改。