2016-04-22 71 views
0

在我的网络应用程序中,我需要从gcs中逐一提取对象并处理它们。
所以问题是,
“我如何发送请求到gcs来获取下一个未处理的对象?”是否可以按照FIFO顺序处理Google Cloud Storage存储桶中的对象?

我想要做的就是简单地依靠gcs提供的排序顺序,然后逐个处理这个排序列表中的对象。 这样,我只需要跟踪我的应用程序中最后处理的项目。 我想要依靠桶中每个单独对象的timeCreated时间戳提供的排序顺序。

当我通过JSON API查询我的存储桶时,我注意到这些对象是按timeCreated从最旧到最新排序的。

例如,此查询...

enter image description here

返回此列表...

{ 
"items": [ 
    { 
    "name": "cars_train/00001.jpg", 
    "timeCreated": "2016-03-23T19:19:47.506Z" 
    }, 
    { 
    "name": "cars_train/00002.jpg", 
    "timeCreated": "2016-03-23T19:19:49.320Z" 
    }, 
    { 
    "name": "cars_train/00003.jpg", 
    "timeCreated": "2016-03-23T19:19:50.228Z" 
    }, 
    { 
    "name": "cars_train/00004.jpg", 
    "timeCreated": "2016-03-23T19:19:51.377Z" 
    }, 
    { 
    "name": "cars_train/00005.jpg", 
    "timeCreated": "2016-03-23T19:19:51.778Z" 
    }, 
    { 
    "name": "cars_train/00006.jpg", 
    "timeCreated": "2016-03-23T19:19:52.817Z" 
    }, 
    { 
    "name": "cars_train/00007.jpg", 
    "timeCreated": "2016-03-23T19:19:53.868Z" 
    }, 
    { 
    "name": "cars_train/00008.jpg", 
    "timeCreated": "2016-03-23T19:19:54.925Z" 
    }, 
    { 
    "name": "cars_train/00009.jpg", 
    "timeCreated": "2016-03-23T19:19:58.426Z" 
    }, 
    { 
    "name": "cars_train/00010.jpg", 
    "timeCreated": "2016-03-23T19:19:59.323Z" 
    } 
] 
} 

这类由timeCreated顺序是正是我需要的,虽然我不如果我可以依靠这一直是真实的,那么确定吗?

所以,我可以编写我的应用程序来处理这个列表,只需搜索第一次创建的值大于最后处理的对象。

问题是这个列表可能非常大,每次用户按下NEXT按钮时,都会通过巨大的列表进行搜索,计算量过大。

我希望能够在我的查询中指定gcs来过滤列表,以便仅返回我需要的单个项目。

该API允许我设置的maxResults回到了1

值不过,我没有看到一个选项,让我只返回一个对象,其timeCreated值比我指定的值。

我想我想要做的可能是相当普遍的,所以我猜测这个问题可能存在解决方案。

解决此问题的一个方法是将已处理的对象物理移动到另一个存储桶。 这样,列表中的第一个项目总是最新的,我可以简单地发送请求maxCount = 1。

但因为它迫使我这增加了复杂性都对每一个项目,而不是1

2个独立的桶是有办法的对象名单进行过滤,只包括那些其timeCreated日期超过指定值?

在MySQL中,它可能是这样的......

SELECT name 
FROM bucket 
WHERE timeCreated > X 
ORDER BY timeCreated 
LIMIT 1 

回答

1

您可以在斗配置对象更改通知,每一个新的对象到达时得到通知。这将允许您在每次不扫描长列表的情况下处理新对象。它还避免了列出存储桶最终一致的问题(因此,当列出对象时,最近上传的对象可能不会立即显示;我不知道这对您的应用程序是否有问题)。

有关对象更改通知的详细信息记录在https://cloud.google.com/storage/docs/object-change-notification

1

在GCS中的对象列表是不是按时间排序创建。对象列表结果总是按字母顺序排列。在你的例子中,这两件事情只不过是赶上了。

如果您想要按上传顺序获取对象列表,则必须确保每个对象的名称的字母顺序都比上载的任何对象的名称晚。但是,即使如此,您也必须小心,因为对象列表最终是一致的,这意味着您上传的对象可能不会立即显示在列表中。

如果某些对象排序非常重要,那么在单独的数据结构中维护一个单独的对象索引和它们的时间戳是个不错的主意,或许可以像Mike建议的那样通过对象更改通知来填充对象。

相关问题