在我的网络应用程序中,我需要逐个从gcs中提取对象并进行处理
所以问题是,
“如何向gcs发送请求以获取下一个未处理的对象?”
我想做的是简单地依赖gcs提供的排序顺序,然后逐个处理这个排序列表中的对象。 这样,我只需要跟踪我的应用中最后处理的项目。 我想依赖于timeCreated时间戳为存储桶中每个单独对象提供的排序顺序。
当我通过JSON API查询我的存储桶时,我注意到对象的返回按时间从最旧到最新排序。
例如,此查询...
返回此列表......
{
"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的这种排序正是我所需要的,虽然我不确定我是否可以依赖它始终是真的?
所以,我可以编写我的应用程序来处理这个列表,只需搜索第一个timeCreated值大于最后一个处理过的对象。
问题是这个列表可能非常大,并且每次用户按下NEXT按钮时搜索大量列表的计算成本太高。
我希望能够在我的查询中指定gcs来过滤列表,以便我只返回我需要的单个项目。
API允许我将返回的maxResults设置为值。
但是,我没有看到一个选项,只允许我返回timeCreated值大于我指定值的对象。
我认为我想要做的事情可能相当普遍,所以我猜这个问题可能存在解决方案。
解决此问题的一个方法是将已处理的对象物理移动到另一个存储桶。 这样,列表中的第一项始终是最新项,我可以简单地发送maxCount = 1的请求。
但是这增加了复杂性,因为它迫使我为每个项目而不是1个拥有2个独立的桶。
有没有办法过滤这个对象列表,只包括那些timeCreated日期高于指定值的对象?
在MySQL中,它可能类似于......
SELECT name
FROM bucket
WHERE timeCreated > X
ORDER BY timeCreated
LIMIT 1
答案 0 :(得分:1)
您可以在存储桶上配置对象更改通知,并在每次新对象到达时收到通知。这样您就可以在不扫描长列表的情况下处理新对象。它还避免了列出存储桶最终一致的问题(因此,当您列出对象时,最近上传的对象可能不会立即显示;我不知道这对您的应用程序是否有问题。)
有关对象更改通知的详细信息记录在https://cloud.google.com/storage/docs/object-change-notification。
答案 1 :(得分:1)
GCS中的对象列表
如果要按照上传顺序获取对象列表,则必须确保每个对象的字母顺序晚于其之前上载的任何对象的名称。但是,即使这样,您也必须小心,因为对象列表最终是一致的,这意味着您上传的对象可能不会立即显示在列表中。
如果对象的某些排序非常重要,那么最好在单独的数据结构中维护对象及其时间戳的单独索引,也许可以通过Mike建议的对象更改通知来填充。