Облачное хранилище Google предоставляет ServiceUnavailable: исключение 503 Ошибка сервера - PullRequest
2 голосов
/ 16 мая 2019

Я пытаюсь загрузить файл в Google Cloud Storage Bucket. Делая это публично, я периодически получаю это исключение от Google. Эта ошибка появляется почти один раз за 20 загрузок. google.api_core.exceptions.ServiceUnavailable: 503 GET https://www.googleapis.com/storage/v1/b/bucket_name/o/folder_name%2FPolicy-APP-000456384.2019-05-16-023805.pdf/acl: Backend Error

Я использую python3 и пытался обновить версию google-cloud-storage до 1.15.0, но это не помогло.


class GoogleStorageHelper:
    def __init__(self, project_name):
        self.client = storage.Client(project=project_name)

    def upload_file(self, bucket_name, file, file_name, content_type, blob_name, is_stream):
        safe_file_name = self.get_safe_filename(file_name)
        bucket = self.client.bucket(bucket_name)
        blob = bucket.blob(safe_file_name)
        if is_stream:
            blob.upload_from_string(file, content_type=content_type)
        else:
            blob.upload_from_filename(file, content_type=content_type)
        blob.make_public() // Getting Error here
        url = blob.public_url
        if isinstance(url, six.binary_type):
            url = url.decode('utf-8')
        logger.info('File uploaded, URL: {}'.format(url))
        return url

    @staticmethod
    def get_safe_filename(file_name):
        basename, extension = file_name.rsplit('.', 1)
        return '{0}.{1}.{2}'.format(basename, datetime.now().strftime('%Y-%m-%d-%H%M%S'), extension)

Вы сталкивались с такой проблемой и решили ее? Или есть какие-либо идеи, чтобы решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 16 мая 2019

Это недавно известная проблема с GCS, использующим метод Python make_public().Проблема сейчас решается командой GCS.

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

0 голосов
/ 07 июня 2019

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

Все функции upload_from_string () - это вызов метода upload_from_file (), который имеет повторные попытки, но реализация игнорирует повторные попытки.

def upload_from_string(self, 
                       data, 
                       content_type="text/plain", 
                       client=None, 
                       predefined_acl=None):
    data = _to_bytes(data, encoding="utf-8")
    string_buffer = BytesIO(data)
    self.upload_from_file(
        file_obj=string_buffer,
        size=len(data),
        content_type=content_type,
        client=client,
        predefined_acl=predefined_acl,
    )    

Вы можете взломать метод upload_from_string (), используя upload_from_file () реализация, добавив повторных попыток:

from google.cloud._helpers import _to_bytes
from io import BytesIO
from google.cloud.storage import Blob

def upload_from_string(
    data, file_path, bucket, client, content_type, num_retries
):
    data = _to_bytes(data, encoding="utf-8")
    string_buffer = BytesIO(data)    

    blob = Blob(file_path, bucket)

    blob.upload_from_file(
        file_obj=string_buffer,
        size=len(data),
        client=client,
        num_retries=num_retries,
        content_type=content_type
    )
...