Рубрики
Без рубрики

Как оглядываться назад может помочь нам двигаться вперед: ретроспектива на программных драгоценных камнях и испачках

Автор оригинала: Pakal de Bonchamp.

Возможно, одно из самых важных качеств разработчика – это способность выбрать правильный инструмент для правильной работы, не прыгая на полосы Bandwagons или изобретать колесо Отказ Это может потребовать немного технологического анализа, но еще больше, прикосновение критического мышления.

Вот обзор нескольких преувеличенных тенденций и недооцененных щелков, в разных областях изумительного мира информатики: Базы данных, асинхроничность, криптовалюта и форматы данных Отказ Я не буду трогать тему отдыха веб-сервисов, которые я уже РАНТИЛ ОТ БОЛЬШОЙ ДЛИННЫЙ Отказ

Как обычно, ваши отзывы более чем приветствуются, если в этой (не полностью беспристрастному) агрегате есть какие-либо фактические ошибки.

Базы данных: NoSQL & ZODB

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

Таким образом, новые проекты массово расстраивали их в пользу магазинов для значений ключей, таких как Redis, ориентированные на документальные базы данных, такие как Mongodb/CouchDB или ориентированные на графические базы данных, такие как Neo4j. И мы должны признать одно: эти новые базы данных сияли в тестах; Они сияли так много …. как бы сиял любая база данных SQL, падая все его Кислотные ограничения и спросить язык гибкости.

Но горизонт был мрачным для многочисленных программистов. Они узнали, что трудно, что настойчивость данных не была незначительной проблемой. И что им нужно, например, к явно активируйте «писать проблемы» в MongoDB, чтобы гарантировать, что данные не будут потеряны до достижения оксида диска.

Они узнали, что «возможная консистенция» было красивым словом для «временного несоответствия», открывая дверь до противных, молчающих, трудно воспроизводящихся в производстве. А что транзакции – и их неявное замок – были драгоценные особенности, а что имитируя их вручную, с неловкими флагами, фаршированными документами, все было просто и прочно.

И они узнали, что схемы данных и ссылочная целостность были более чем приветствуем, чтобы предотвратить становление кучей баз данных о бессвязных объектах. И что отсутствие расширенных возможностей индексации (на нескольких ключах на полях Deep Document) в магазинах ключевых значений может стать довольно неловком.

Таким образом, люди начали изобретать SQL-функции на вершине баз данных NoSQL, путем побуждения схем данных, иностранных ключей, расширенной агрегации в языковых библиотеках «Орм» (монгоэнгин, монгоид, монгурппер …). В этом контексте этот «объект-реляционный Mapper» Acrony должен иметь, само собой, был намек, что что-то сошло диким.

Было что-то сюрреалистическое при просмотре баз данных NoSQL, которые были отточены на конкретные случаи использования (очень реплицированные или гетерогенные данные, Коллекции с ограниченными возможностями или TTLS , PUB/Sub Systems …), быть использованным только Чтобы сохранить кучу однопористых объектов в одном экземпляре сервера.

Стандартная база данных SQL будет полностью проделана задание и предложила еще много вариантов и плагинов для инструментов (различные двигатели хранения, сценарии инструментов Percona, IDes, такие как Heidisql или MySQL Workbench, процессы миграции схемы DB, интегрированные в веб-каркасы …). Даже если это означало набивки дополнительных неструктурированных данных в сериализованное текстовое поле (или в настоящее время, посвященные PostgreSQL JSON ).

Со временем NoSQL базы данных сами улучшились, помимо прочего, заимствующие функции из мира SQL. Но Reventing SQL не является легкой задачей. Реляционные базы данных с анализом языка запросов, наборы персонажей и сопоставление, агрегация данных и преобразование, транзакции и уровни изоляции, просмотры и кэширования запросов, триггеры, встроенные процедуры, ГИС , мелкозернистые разрешения, репликация и кластеризация … Комплексные и чувствительные функции, приводимые в движение сотнями настроек, распространяются на нескольких уровнях (на базу данных на таблицу на соединение).

Таким образом, несмотря на их большие прогресс (транзакции с несколькими документами, лучшие агрегации данных, сохраненные функции JavaScript, хранение для хранения, контроль на основе ролей в MongoDB), NoSQL DBS по-прежнему возникнут проблемы с сложными базами данных SQL, чисто функционально.

К счастью, большинство проектов нуждаются в крошечном подмножестве этих функций базы данных SQL: несколько валецитов схемы, несколько правильных индексов, а бизнес может получить прокат; Таким образом, для команд не хватает экспертизы SQL, относительная простота многих NoSQL DBS действительно может быть, если честно, соответствующий фактор.

Волна, по-видимому, сейчас исчезла, и проекты кажутся более склонны объединять различные базы данных в соответствии с фактическими потребностями. Таким образом, они отделяют учетные записи пользователей, очереди заданий и аналогичные кэши, данные журнала и данные статистики … каждый в наиболее подходящем хранилище.

Все эти цитируемые базы данных NoSQL и их бесчисленные альтернативы, блестящие в их предполагаемых случаях использования. Но я хотел бы упомянуть слишком малоизвестный, слишком маленький драгоценный камень экосистемы Python. Вы уже хотели сохранить ваши данные на самом деле, Reaaaallly легко? Тогда я отправляю вас на ZODB Отказ Вы открываете его как словарь, вы толкаете любые данные, которые вы хотите в него, вы совершаете транзакцию, и вы добруетесь.

Пример простого локального экземпляра ZODB:

from ZODB import FileStorage, DB
import transaction

storage = FileStorage.FileStorage('mydatabase.fs')
root = DB(storage).open().root()
print("ROOT:", root)
root['employees'] = ['Mary', 'Jo', 'Bob']
transaction.commit()

Графики данных обрабатываются изящно (отсутствие ошибки рекурсии), объекты лениво загружены на доступе, специальные типы «ведра» приведены для просмотра огромных объемов данных при сохранении низкой памяти, и несколько бэкверсионов хранения существуют, в том числе Relstorage который использует мощность баз данных SQL. Идеально, не так ли?

Хорошо, я лгу, есть несколько готов. Нет встроенной системы индексации (необходимо использовать ZCatalog или Allbere). Использование выделенных «постоянных» типов высоко рекомендуется автоматически обнаруживать и упорствовать мутации объектов. Общая инструментальная запись довольно ограничена по сравнению с основными базами данных. И модель параллелизма, основанная на «оптимистичном блокировке», может заставить вас при сильной нагрузке, чтобы повторить операцию в несколько раз, пока она не удается применить.

Чрезвычайное количество интеграции с языком Python имеет дополнительный недостаток: если вы ввели изменение разбития в вашу модель данных, ваша база данных может больше не загружаться, поэтому вы должны тщательно обрабатывать миграции схемы.

Но контекст – это все: ZODB не предназначен для долгосрочных и совместимых данных о сохранении данных, но для легкого хранения (возможно, очень гетерогенных) объектов Python. Он может создавать длинные сценарии, способные возобновить после прерывания, он может хранить данные игрока онлайн-игрных сеансов … Если вы действительно хотите хранить статьи в блоге или личных счетах в ZODB, вы лучше ограничивают себя родным типам Python, а также внедрить свои собственные достоверности чеков. Но что бы ни случилось, не используйте очень ограниченный STDLIB полки Если вы можете иметь Nifty ZODB под рукой, чтобы сохранить данные о работе во время прогресса.

Асинхроничность: асинсио, трио и зеленые нити

Между синхронными и асинхронными моделями программирования произошла немнормальная задача. Ядра предоставили асинхронные режимы для дисковых операций, с более или менее успешным ( перекрывались неблокирующие IO на Windows, Limited io_submit () API на Linux …).

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

Некоторые языки, такие как Эрланд, столкнулись с этим, будучи асинхронным с самого начала, и позволить разным задачам общаться по сообщениям, прохождение (A.k.a Actor Model ).

На других языках несколько шаблонов дизайна появились для решения проблемы:

  • обратные вызовы
  • async/a ждать синтаксис
  • Легкие нити

Обратные вызовы ранее были основным решением в основных структурах. Например, в jQuery или скрученном, разработчик предоставит Callables в качестве аргументов или в качестве методов экземпляра, и они будут вызываться на завершение/отмене IO, в шаблоне, называемом Инверсия контроля Отказ Это наверняка работает, но это делает программные потоки довольно сложно предсказать и отлаживать, отсюда, отсюда термин «суп обратного вызова», часто используемый в этом контексте.

За последние несколько лет Async/await Синтаксис стал очень модным, особенно в мире Python. Но есть проблема: как инверсия контроля, это совершенно новый способ программирования, почти новый язык. Огромное количество пакетов в настоящее время доступных в настоящее время, изготовленных из модулей, классов и методов, просто не работает с Async/ждут.

Любой IO, любая дорогая операция, скрытая глубокая внутри субдуспедитации, может испортить ваш день. Таким образом, в настоящее время мы смотрим на тысячи великих модулей, которые будут радостно переоценены, с совершенно новым миром ошибок и отсутствующих функций.

Это все стоит? Разработчики Python Massivity прыгнули на поезд Asyncio Пакет, который стал частью Stdlib. Но эта технология имеет страшные проблемы, такие как затруднение гнездового бэкпресса, хрупкое обращение с исключениями и Ctrl-C, небезопасной аннулированием (утечка) задач, а также крутая кривая обучения API, полна Gotchas и избыточных концепций. Другие рамки, такие как Trio/Curio, казалось гораздо более осторожно на этих предметах Отказ

Если мы должны восстановить тонны существующих библиотек, зачем базовые новые версии на двигателе, что у некоторых разработчиков есть – не без аргументов – называется Огонь мусорной конверсии плохого дизайна ? Но сетевой эффект Огромно в таких случаях, и альтернативные асинхронизированные/ждут рамоты будут трудно сломать стандарт.

А как насчет третьего рисунка, указанного выше, легкие нити? Задолго до этой асинхронизации/ждут тенденции python думал: у нас уже есть совершенно прекрасный синхронный бизнес-код, поэтому давайте изменим, как он работает, не так, как он написан. Таким образом появились легкие нити или «зеленые». Они работают как пучок крошечных задач, запланированных на вершине нескольких родных потоков, задачи, которые дают контроль друг к другу только тогда, когда они блокируют на io или явно; И с гораздо большей производительностью, чем родные нити, с точки зрения использования памяти и задержки переключения.

В конце концов, эта система может быстро повысить любую существующую кодовую базу, чтобы она поддерживала тысячи долгосрочных одновременных задач. И это не изолированный безумный эксперимент: легкие нити Python изначально использовались в онлайн-игре в канунке (через StateLel Python), и с тех пор, как успешно портирован на CPYthon (Gevent, Eventlet …) и Pypy. И у них на самом деле существовал в течение длительного времени Во многих языках программирования под разными именами (зеленые процессы, зеленые нити, волокна …).

Недостатки этой системы?

  • Библиотеки должны сыграть приятно играть с зелеными нитками, обеспечивая контроль вместо блокировки на iOS, и запустив зеленые нити вместо собственных нитей. В Python основными библиотеками (розетка, время. Sleep (), Threading) насильственно сделаны зелеными благоприятными через обезьяну. Но скомпилированные расширения должны быть особенно проверены, поскольку они могут обойти эти патчи и блокировать свои собственные системные вызовы.
  • Нет тяжелых вычислений или иным образом трудоемких задач, должны быть выполнены, все остальные другие задачи влияют на задержку. Для таких потребностей просто делегировать работу в пул родные потоки (или сельдерей – подобная рабочая очередь).

Как видим, эти недостатки аналогичны таковым из асинхронизации/ждут, за исключением того, что вам почти не нужно касаться оригинального, синхронного кода. «За исключением», что может означать месяцы или годы работы на работе; Ваш CTO и CEO должны быть очень довольны этим.

Теперь вы будете иногда слышать странные рационализацию от людей, которые бросили легкие нити в пользу целого асинхронизации/ждут возмещения. Что-то в направлениях « явных лучше, чем неявным, и все это ждет, точно показывают мне, где мой код может переключать контекст, тогда как зеленые потоки могут быть незаметно, если сторонняя функция выполняет любой тип IO или явный коммутатор “.

Но вещь …

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

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

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

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

Этот наивный код показывает, как недавно добавленный вызов log_counter_value () разбивает в противном случае безопасный асинхронный код.

async def increment_counter(counter):
     current = counter.current_value
     await log_counter_value(current)  # Unwanted context switch happens here
     counter.current_value = current + 1

Во-вторых, вы действительно должны иметь дело с синхронизацией? В веб-стране особенно, где HTTP-запросы не должны взаимодействовать, мы хотим параллелизацию, а не совпадение. Предполагается, что постоянные данные (и транзакции) должны обрабатываться внешними базами данных и кешиками, а не в процессе процесса памяти.

Настолько обычная передовая потребляемая поток безопасности (используя безопасную резьбу инициализации процесса через замки, структуры только для чтения для глобальных данных и данные с чтением, только для чтения, только локальные для кадров стека) достаточно, чтобы сделать всю систему «Тема/Greenlet/Asyncysask Safe ».

Если однажды вам нужно реализовать очень одновременные алгоритмы внутри процесса, вы выберете лучший инструмент для этого, но не нужны для фабрики нагрузочных молотка, если все, что вам нужно сделать, это вотворить один гвоздь.

Деньги: биткойны и альтернативы

Давайте подумай на мгновение. Каковы самые большие задачи нашего 21-го века? Изменение климата? Уклонение от налогов? Легитимность государственной власти? Так что откровенные умы могут подумать, что энергичные трезвости, финансовые прослеживаемость и (действительно) демократические организации будут целями для преследования.

Но группа умных хакеров решила, что нынешние деньги были серьезной проблемой, и придумали биткойны: энергетическое «доказательство работы» системы, легкая анонимность держателей денег и нечеткой (для наименее) управления.

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

Эти деньги, и его скоро появились братья и сестры, имеют историю, уже полную посторонние моменты, с случайными цепными расщеплениями, Мягкие вилки заблокирован для Политические причины , тяжелые вилки Совершенно произвольно определяется разными людьми (или вынужденными кибератаки ), и бесконечные сражения между различными валютами или разными версиями одной и той же валюты (Bitcoin Core, Cash, Gold, SV …). Алгоритмы (криптография, консенсус, код транзакции …) были оценены в качестве фундамента системы самоуправления и самоуправления, но некоторые актеры должны были взломать своих пользователей Чтобы защитить их от кражи, в то время как даже настолько прославленные «умные контракты» показали нагрузки Страшные слабости безопасности и Не так много случаев использования как ожидаемый.

Давайте понять: блокчан, публичная книга, основанная на деревьях Merkle, далека от плохой идеи. Но когда решения не основаны на потребности общества и осторожности в отношении ошибок, но по идеологии и жадности, результат может быть предсказан. А снижение в шуйке пропорционально чрезмерно инвестированным надеждам.

Что такое «лучше» аналог биткойна, этюренма и тому подобное? Существуют много альтернативных криптовалютур с более легкими формами авторизации, с различными криптовыми алгоритмами, с различными параметрами конфиденциальности, с различными показателями усыновления … но если вы спросите меня, что нам действительно нужно, это « легко прослеживаемые деньги для Государственные финансы и НПО “; Общественная бухгалтерская книга, разработанная так, чтобы любой гражданин мог легко проверить, как используется государственные деньги, с момента, когда он собирается по налогам и пожертвованиям, на тот момент, когда он возвращается в частные цепи, оплатив груз или зарплату товаров или работников или сотрудников или работников или работников или заработной платы Есть ли что-нибудь подобное существует, кто-нибудь? Не мог найти это …

Можно также упомянуть некриптографический, но Местный Moneys (бывший. « Го Гунета » в Лионе, Франция), сохраняющихся на паритете с национальными народными монами, которые имеют преимущество в пользу местных предприятий и, таким образом, о снижении ущерба для международной торговли.

Форматы данных: текст и двоичный

Остроумный прохожий однажды определил XML как « читаемость двоичных данных с эффективностью текста ». Действительно, анализаторы XML имеют тенденцию быть вялым, а также к памяти беспорядки (когда в режиме DOM) по сравнению с бинарными передачами данных; и редактирование конфигураций XML и документов вручную не является лучшим пользователем, который может иметь.

Мы легко понимаем, почему XML, в качестве металлуша, позволяя создавать новые теги и свойства для всех видов использования, должны быть так многослойными. Но почему такой энтузиазм для текстовых форматов, когда цель – передавать информацию между серверами, используя четко определенные типы данных?

Установка полезных нагрузок HTTP во внутреннее представление, а затем анализ, например, его корпус JSON, в конечном итоге добавляет значительные накладные накладные запросы WebService. Для чего выгода? Двоичные форматы, такие как BSON сделает сериализацию/десериализацию гораздо более исполнителю; и семантически эквивалентные текстовые форматы могут быть использованы для отладки (автоматически преобразованы инструментами Web Browser, Wireshark, Curl и Takestes), а также для выработки по окрашиванию вручную.

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

Заключение

Что такое мораль всего этого? Всегда одинаково, ” Используйте правильный инструмент для правильной работы и остерегайтесь иррациональных испачек ». Он может занять много чтения, прежде чем у кого-то есть достаточный вид глубины, на конкретную материю, для принятия образованных решений; Но эта инвестиция быстро окупается.

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