Как обеспечить последовательное удаление и вставку записей в хранилище данных Google с помощью двух облачных функций Google? - PullRequest
0 голосов
/ 24 апреля 2019

Я создал облачную функцию для запуска файлов в хранилище. Тип триггера: Облачное хранилище Тип события: Завершить / Создать

Затем, если файл загружен в корзину, облачная функция вставит запись (ключ: местоположение) в имя_таблицы в хранилище данных.

Требуется обновить запись, если файл удален. Итак, я создал еще одну облачную функцию с типом события «Удалить». Другая облачная функция скопирует свойства записи, чтобы вставить новую запись (ключ: uuid) и удалить старую.

Эти функции работают хорошо. Однако, когда я заменяю одноименный файл, он вызывает функцию «Удалить» и «Завершить / Создать» почти одновременно. То, что я нашел в table_name в хранилище данных, это только новая запись (key: uuid), что означает, что я потерял запись (key: location).

Я пытаюсь добавить код для задержки при вставке записи (ключ: местоположение), если загружен. Это всегда работает, но иногда терпит неудачу.

Или мне нужно знать, как использовать транзакцию, чтобы убедиться, что сначала выполняется действие удаления, а затем действие вставки. Я действительно не знаю транзакции.

Функция Cloud (node.js8) для загрузки файлов:

'use strict';
exports.upload = async (event, context) => {

    const processingFile = event.name;
    console.log(`  Created: ${event.timeCreated}`);

    let data = {
        property_a: '',
        property_b: '',
        location: processingFile
    };
    try {
        // await delay(5000);
        await insertData(data);
    } catch (err) {
        console.error(err);
    }
};

const delay = ms => new Promise(res => setTimeout(res, ms))

async function insertData(data) {
    const datastore = new Datastore({projectId: projectId, namespace: namespace});

    let name = data.location;
    const taskKey = datastore.key(['table_name', name]);

    // Prepares the new entity
    const task = {
        key: taskKey,
        data: data
    };
    // Saves the entity
    await datastore.save(task);
    console.log(`Save ${task.key.name}: ${task.data.location}`);
}

Это не всегда работает, и я не хочу ждать этого. Облачная функция (python3.7) для удаления файлов:

def delete(event, context):
    try:
        if:  # Exclude folders
            key_name = event['name']
            update(project_id, namespace, key_name)
    except Exception as e:
            print("Error: " + str(e))

def update(project_id, namespace, entityName):
    from google.cloud import datastore
    client = datastore.Client(project=project_id, namespace=namespace)

    import datetime
    with client.transaction():
        key = client.key('table_name', entityName)
        task = client.get(key)

        if not task:
            raise Exception("The entity does not exist.")

        # Copy the record
        # Insert a record(key: uuid) with auto-incrementing id
        incomplete_key = client.key('table_name')
        uuid_task = datastore.Entity(key=incomplete_key)
        data_properties = ['property_a', 'property_b', 'location']
        for data_property in data_properties:
            if data_property in task:
                uuid_task.update({
                    data_property : task[data_property]
                })
        client.put(uuid_task)

        # Delete the record(key: location) 
        client.delete(key)

Следующая запись (ключ: местоположение): Кажется, я копирую запись и заменяю ее, а затем удаляю запись. Чего я хочу добиться, так это скопировать запись и удалить ее, а затем вставить новую запись.

Не могли бы вы дать мне какое-нибудь предложение?

1 Ответ

1 голос
/ 24 апреля 2019

Каждая версия объекта Google Cloud Storage имеет свой собственный номер «поколения». Когда вы создаете новый объект, ваше событие будет включать имя сегмента, имя объекта и номер поколения. Когда вы перезаписываете этот объект новым, вы получите уведомление об удалении старого поколения и уведомление о завершении нового поколения.

Номер поколения в вашем коде будет data["generation"]. Я бы использовал его как часть вашего ключа или как условие для изменения строки.

...