Как обновить значения на многих jsonpaths чрезвычайно быстро? - PullRequest
0 голосов
/ 24 апреля 2020

Постановка задачи: у меня json обычно 15Kb-20Kb. Мне нужно замаскировать значения PII на уровне около 60 путей. Некоторые из путей также являются массивами. Итак, в итоге вы можете предположить около 80 путей (после рассмотрения массивов). Мне нужно сделать это в режиме реального времени с помощью пожарного рукава Kinesis.

Проблема в том, что 1 такой документ занимает 8 секунд в aws лямбде, чтобы замаскировать все поля и заменить значения sha256

Информация для бенчмаркинга:

используемые библиотеки: jsonpath-ng (это занимает время) и hashlib

лямбда-память = 128 МБ. (использует только 50 МБ, поэтому маловероятно)

Код:

        platformS3Object = json.loads(base64.b64decode(record['data']).decode('utf-8'))

        payload = json.loads(platformS3Object['message'])
        routingKey = platformS3Object['metaData']['routingKey']

        print("Routing Key:" + routingKey)
        for jsonPath in fieldConfigurations[routingKey]:
            jsonpath_expr = parse(jsonPath)
            for match in jsonpath_expr.find(payload):
                if isinstance(match.value, int):
                    jsonpath_expr.update(payload, (abs(hash(match.value)) % (10 ** 8)))
                elif isinstance(match.value, str):
                    jsonpath_expr.update(payload, sha1(match.value.encode('UTF-8')).hexdigest())


        platformS3Object['message'] = payload

        output_record = {
            'recordId': record['recordId'],
            'result': 'Ok',
            'data': base64.b64encode(json.dumps(platformS3Object).encode('utf-8')).decode('utf-8')
        }

        output.append(output_record)

Намерение:

Хотите добиться максимально быстрого маскирования, 8 секунд для документов 15 КБ кажется немного странно и очень медленно. Я ожидал, что это будет максимум на 500 мс, очень неприятно удивленный результатами. Пожалуйста, помогите мне улучшить время выполнения до наилучшего из возможных.

...