Існує всіляка техніка для високоефективної обробки транзакцій, і ця у статті Фаулера - лише одна з багатьох на межі кровотечі. Замість того, щоб перелічити купу методів, які можуть або не можуть бути застосовні до чиєїсь ситуації, я думаю, що краще обговорити основні принципи та те, як LMAX вирішує велику кількість їх.
Для широкомасштабної системи обробки транзакцій потрібно максимально виконати всі наступні дії:
Мінімізуйте час, витрачений у найповільніші рівні зберігання. Від найшвидшого до найповільнішого на сучасному сервері у вас є: CPU / L1 -> L2 -> L3 -> RAM -> Disk / LAN -> WAN. Перехід від навіть найшвидшого сучасного магнітного диска до найповільнішої ОЗУ перевищує 1000 разів для послідовного доступу; випадковий доступ ще гірший.
Мінімізуйте або усуньте час, витрачений на очікування . Це означає обмін якомога меншим станом, і, якщо стан потрібно поділити, уникаючи явних блокувань, коли це можливо.
Розподіліть навантаження. Процесори не отримали набагато швидше , в останні кілька років, але вони вже отримали менше, і 8 ядер досить часто зустрічаються на сервері. Крім того, ви навіть можете поширити роботу на декілька машин, що є підходом Google; чудова річ у тому, що вона масштабує все, включаючи введення-виведення.
За словами Фоулера, до кожного з них LMAX застосовує такий підхід:
Залишайте весь стан у пам’яті постійно . Більшість двигунів баз даних дійсно роблять це все одно, якщо вся база даних може вміститись у пам'яті, але вони не хочуть залишати нічого випадковому, що зрозуміло на торговій платформі в режимі реального часу. Щоб зняти це, не додаючи тонни ризику, їм довелося побудувати купу легкої інфраструктури резервного копіювання та відмовлення.
Для потоку вхідних подій використовуйте безблокову чергу ("деструктор"). На відміну від традиційних тривалих черг повідомлень, які остаточно не блокуються, і насправді зазвичай передбачають болісно повільні розподілені транзакції .
Не багато. LMAX кидає цю під шину, виходячи з того, що навантаження взаємозалежні; результат одного змінює параметри для інших. Це критичний застереження, яке Фаулер прямо відкликає. Вони роблять деякі використовують паралелізм для того , щоб забезпечити відмовостійкості, але все бізнес - логіки обробляється на одному потоці .
LMAX - не єдиний підхід до широкомасштабного OLTP. І хоча вона сама по собі є досить блискучою, вам не потрібно використовувати техніку крайнюго кровотоку для того, щоб досягти такого рівня продуктивності.
З усіх вищезазначених принципів, №3, мабуть, є найважливішим та найефективнішим, адже, чесно кажучи, апаратне забезпечення є дешевим. Якщо ви можете правильно розподілити навантаження на півдесятка ядер і кілька десятків машин, то небо є межею для звичайних методів паралельних обчислень . Ви здивуєтеся, скільки пропускної здатності ви можете зняти, не маючи нічого, окрім купи черг на повідомлення та дистрибутора круглої робіни. Це, очевидно, не настільки ефективно, як LMAX - насправді навіть не близько - але пропускна здатність, затримка та економічність є окремими проблемами, і тут ми говоримо конкретно про пропускну здатність.
Якщо у вас є такі ж особливі потреби, що і LMAX - зокрема, спільний стан, який відповідає діловій реальності на відміну від поспішного вибору дизайну - тоді я б запропонував спробувати їх компонент, тому що я не бачив багато інше, що відповідає цим вимогам. Але якщо ми просто говоримо про високу масштабованість, то я б закликав вас зробити більше досліджень розподілених систем, оскільки вони є канонічним підходом, який сьогодні застосовує більшість організацій (Hadoop та пов'язані з ними проекти, ESB та суміжні архітектури, CQRS, які також Фоулер згадки тощо).
SSD також перейдуть на зміну ігор; Можливо, вони вже є. Тепер ви можете мати постійне сховище з аналогічним часом доступу до оперативної пам’яті, і хоча серверні диски з рівнем сервера все ще жахливо дорогі, вони з часом зменшаться в ціні, коли рівень прийняття зросте. Це було широко досліджено, і результати були досить приголомшливими і з часом будуть покращуватися, тому ціла концепція "зберігати все в пам'яті" набагато менш важлива, ніж раніше. Тому я ще раз намагаюся зосередитись на конкурентності, коли це можливо.