Вот что говорит википедия про Amazon S3: онлайновая веб-служба предлагаемая Amazon Web Services, предоставляющая возможность для хранения и получения любого объема данных в любое время из любой точки сети так называемый файловый хостинг. С помощью Amazon S3 достигается высокая масштабируемость, надежность, высокая скорость и недорогая инфраструктура хранения данных. Впервые появилась в марте 2006 года в США и в ноябре 2007 года в Европе.

На сегодняшний день S3 storage получила очень большое распространение и поддерживается практически всеми облачными провайдерами. Из описания S3 storage мы видим, что эта штука предназначена для хранения файлов с быстрым доступом к ним из всего мира. И это стереотип! Все, кто недостаточно знаком с S3, считают, что этот сервис предназначен для хранения файлов.

Точно такое же мнение про S3 storage было и у меня до тех пор, пока я не попал в мой текущий проект по разработке онлайн игры для десктопа. Изучая серверную часть проекта, я был удивлён, что мы не используем какую либо базу данных, а пишем все в S3. Сначала это сильно шокировало меня, но пообщавшись с разработчиками я пришёл к выводу, что мы не только не проигрываем, используя S3, а наоборот выигрываем. 

По сути, мы используем S3 как key-value базу данных, и после проведения ряда тестов я убедился, что производительность такого решения в ряде случаев намного выше, чем производительность современных key-value баз данных. Вы просто забываете про описание, про файловый хостинг и оперируете понятиями key-value. И в случае использования для этих целей S3 storage: имя объекта S3 - это key, а содержимое объекта - это value. И всё становится легко и понятно! Вы проектируете базу, хранящуюся на S3, также как обычную key-value базу данных.

Ну и для того чтобы окончательно абстрагироваться от того, что S3 - это файловый хостинг, и для облегчения использования S3 storage как key-value базы данных, был написан пакет s3teo на языке Go.

Следующий код демонстрирует простоту использования S3 storage как key-value:

// Connect to S3 storage
con, err := teos3.Connect(accessKey, secretKey, endpoint, secure)
if err != nil {
    log.Fatalln(err)
}

// Set key to teos3 Map
err = con.Map.Set(key, data)
if err != nil {
    log.Fatalln(err)
}

// Get key from TeoS3 Map
data, err := con.Map.Get(key)
if err != nil {
    log.Fatalln(err)
}

Проект содержит пример, описание в README и документацию на go.dev.

Кроме пакета teos3, в проекте присутствует утилита s3cp для копирования файлов на s3 storage. Эта утилита построена на функциях пакета teos3.

Смотрите описание и код проекта на github

Спасибо за внимание!
С уважением,
Кирилл Щерба
kirill@scherba.ru

Комментарии (4)


  1. dejecher
    07.11.2022 10:40

    Все, кто недостаточно знаком с S3, считают, что этот сервис предназначен для хранения файлов.

    Точно такое же мнение про S3 storage было и у меня

    вы конечно узнали много нового для себя но... это вовсе не отткровение. А то что вы лично были недостаточно знакомы с явлением говорит лишь о том, что вам просто это былдо не нужно до какого-то момента времени. Как понадобилось - сразу узнали. Наступит время - узнаете о минусах такого решения


    1. Myclass
      07.11.2022 11:25

      Тоже не совсем понял. Ведь с первых секунд работы с s3 знаешь, что каждое имя файла оригинально, нет никаких иерархий - всё плоско. И везде стоит, что это и есть key value хранилище. Ничего другого оно и не подразумевало.


      1. dejecher
        07.11.2022 12:13

        Ну вы можете установить свою иерархию ключей, если захотите. Вы может даже использовать запросы с некоторыми ограничениями (ограничения на формат содержимого value). но все равно по сравнению с тем-же dynamodb функционал ограничен, а по цене решение на основе s3 может выиграть по сравнению с dynamodb только в довольно ограниченном диапазоне вариантов использования. Ну и особенности архитектуры s3 возможно могут неприятно удивить автора - в будующем. Например в определенныъ случаях после того как значение было "обновлено" (перезаписано в смысле), другой процесс который будет пытатться получить это значение будет получать старое, необновленное значение, в течение некоторого времени.

        Но самое главное конечно деньги - их надо уметь считать. Причем не только зджесь и сейчас, но и в будующем - по мере развития и масштабирования сервиса


  1. Hett
    07.11.2022 22:37

    Выдыхай!