Як зберегти програми без стану


97

Це може бути суперечливим питанням, але я намагаюся краще зрозуміти без громадянства.

На основі того, що я прочитав, веб-додатки повинні бути без громадянства, тобто кожен запит трактується як незалежна транзакція. Як результат, слід уникати сеансу та файлів cookie (оскільки вони обидва). Кращим підходом є використання токенів, які не мають статусу, оскільки нічого не зберігається на сервері.

Тому я намагаюся зрозуміти, як веб-додатки можуть бути без громадянства, коли є дані, які зберігаються для мого сеансу (наприклад, предмети в кошику для покупок)? Чи фактично вони десь зберігаються в базі даних, а потім періодично очищаються? Як це працює, коли ви використовуєте маркер замість файлів cookie?

І як відповідне питання, чи є основні веб-сайти (Amazon, Google, Facebook, Twitter тощо) фактично без громадянства? Використовують вони жетони або файли cookie (або обидва)?


38
Останнім часом я бачив і розмовляв з розробниками, які одержимі безгромадянством, аж до відволікання. Приємно мати безгромадянство для повторного використання, але не реально домагатися цієї мети у будь-якій ситуації над будь-якою іншою метою, якщо у вас немає тонни ресурсів для цього з якихось причин, як масштабування.
Марк Роджерс

4
@MarkRogers Чому? Безгромадянські стосунки не мають нічого спільного з повторною діяльністю. І бути без громадянства не призводить до більш високих зусиль.
Пол Васілевський

3
@PaulWasilewski: А бути без громадянства не призводить до більш високих зусиль. => це робить, за допомогою стаціонарного додатку ви зберігаєте все в пам'яті, прив’язаному до сеансу. Це не дуже добре масштабується, хоча працює з фіксацією сеансу, але це ДУЖЕ просто. Коли серверам потрібно почати обмін інформацією між собою, починаються проблеми.
Матьє М.

6
Подивившись на Amazon, ви помітите, що ваш кошик залишається навіть у разі зміни комп'ютера, тому він не зберігається у файлах cookie, а скоріше у базі даних.
njzk2

20
Якщо ви не переходите до прочитання моєї відповіді. Ось коротка версія: Веб-запити за своєю суттю є без громадянства. Веб- додатки - ні. (Незалежно від того, що вам
говорять

Відповіді:


95

"веб-додатки повинні бути без громадянства" слід розуміти як "веб-додатки повинні бути без громадянства, якщо не існує дуже вагомих причин для наявності стану" . "Кошик для покупок" - це особливість, що є дизайном, і заперечувати це досить контрпродуктивно. Вся суть схеми кошика - збереження стану програми між запитами.

Альтернативою, яку я міг би уявити як веб-сайт без громадянства, який реалізує кошик для покупок, було б додаток на одній сторінці, який зберігає кошик кошика повністю на стороні клієнта, отримує інформацію про товар за допомогою дзвінків AJAX, а потім одразу надсилає його на сервер, коли користувач робить замовлення. Але я сумніваюся, що я колись бачив, щоб хтось робив це, тому що це не дозволяє користувачеві використовувати кілька вкладок браузера і не зберігає стан, коли вони випадково закривають вкладку. Звичайно, є обхідні шляхи, як використання локального зберігання, але тоді ви знову маєте стан, лише на клієнті, а не на сервері.

Щоразу, коли у вас є веб-додаток, який вимагає збереження даних між переглядами сторінок, зазвичай це робите, вводячи сеанси. Сеанс, до якого належить запит, може бути визначений за допомогою файлу cookie або за параметром URL, який ви додаєте до кожного посилання. Файлам cookie слід віддати перевагу, оскільки вони зберігають ваші URL-адреси більш зручними та заважають вашому користувачеві випадково ділитися URL-адресою зі своїм ідентифікатором сеансу в ньому. Але використання маркерів URL як резервне також важливо для користувачів, які деактивують файли cookie. Більшість фреймворків веб-розробок мають систему обробки сеансів, яка може робити це нестандартно.

На стороні сервера інформація про сеанси зазвичай зберігається в базі даних. Кешування в пам'яті на стороні сервера необов'язково. Це може значно покращити час відповіді, але не дозволить вам переносити сеанси між різними серверами. Тож вам потрібна стійка база даних як резервна.

чи є основні веб-сайти (Amazon, Google, Facebook, Twitter тощо) фактично без громадянства? Використовують вони жетони або файли cookie (або обидва)?

Чи дозволяють вони увійти? Коли ви закриєте вкладку та перегляньте сайт, ви все ще входите в систему? Якщо ви є, то вони використовують файли cookie, щоб зберегти вашу особистість між сеансами.


46
Я думаю, що одна з плутанин тут - це відмінність між "веб-додатком" у широкому розумінні точки зору користувача та "веб-додатком" у вузькому розумінні "кодом, що працює на веб-сервері". Саме останнє часто доводиться без громадянства, а не перше. Як ви кажете, колишнього немає сенсу бути без громадянства, оскільки держава зазвичай є частиною бізнес-логіки. Для останнього без громадянства це означає, що стан потрібно зберігати на клієнті або сервері баз даних або на обох, а не на веб-сервері.
Дерек Елкінс

16
"[...] але тоді у вас знову є стан, лише на клієнті, а не на сервері." Йдеться про відсутність стану на стороні сервера, щоб досягти кращої масштабованості та доступності. Якщо стан зберігається на стороні клієнта, значення не має.
Пол Васілевський

5
@ njzk2 чи ​​можете ви допрацювати так, щоб це не звучало абсурдно? Користувачі не відвідують Amazon, щоб придбати більше імен. І після покупки щось зникає, що існувало лише під час покупки. Якщо щось не є "станом програми", то що це? Якщо програми не мають стану, що вони мають?

3
@nocomprende: Я думаю, що загальна суть njzk2 полягає в тому, що вміст вашого кошика, як і ваше повне ім'я, - це дані, які веб-сервіс зберігається на стороні сервера. Коли люди кажуть: "webapps має бути без громадянства", вони зазвичай означають щось відмінне від "webapps не має доступу до бази даних, що містить ваше повне ім'я, пов'язане з вашим ім'ям користувача". Саме то , що вони дійсно мають на увазі під «без громадянства» , можливо , ще не тривіальна визначено, так як тільки у вас є ця база даних є всі види дурості , які ви могли б зберегтися там, щоб підтримувати надмірно складний стан додатки, але не повинні ;-)
Steve Jessop

4
@nocomprende: відкручуйте яйце, відкочуючи базу даних: оскільки наш веб-сайт без громадянства, він може відновитись як і раніше ;-)
Стів Джессоп

56

Це правда, що веб-додатки повинні бути без громадянства. Однак змінні, файли cookie та маркери сеансу не порушують це, коли вони зберігаються на клієнті (веб-браузері). Вони можуть бути параметрами у запиті.

Ось спрощена модель:

Web Browser (has state) <-> Web Server (stateless) <-> Database (has state)

Це може працювати для обміну стеками програмного забезпечення . Ця відповідь, яку я набираю, є частиною стану мого веб-браузера. Поки це єдине місце, де воно є, воно недоступне для всіх, крім мене. Але як тільки я натиснув Post your Answerсвій браузер, він надсилає його на веб-сервер. Веб-сервер обробляє публікацію, використовуючи не власний стан. Він дізнається, хто я зі свого браузера та з бази даних. Після того, як буде зроблено перевірку моєї публікації та додавання її до бази даних, веб-сервер негайно забуває про мене.

Ось що означає без громадянства. Сервер не несе відповідальності за запам'ятовування будь-якого цього. Це не його робота.

Це має багато переваг. Якщо веб-сервер має витік пам’яті, його можна виявити, оскільки його пам’ять не повинна зростати. Якщо веб-сервер виходить з ладу, моя особистість не відповідає цьому. Якщо хтось намагається зробити атаку на відмову в сервісі, він не може використовувати ресурси стану веб-сервера для цього, оскільки веб-сервер не виділяє для них жодного стану між сеансами. Це все спрямовано на те, щоб зробити веб-сервер стабільним. Таким чином, коли він починає бігати, він продовжує працювати.

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


8
Я не знаю ... Ця відповідь трохи схожа на те, що сказати: " Excel не зберігає вашу електронну таблицю, дисковий диск робить!" Ха-ха, чи не частина бази даних веб-сервера, що стосується більшості людей? Очевидно, що стан не зберігається в процесорі або коді сервера, і зберігати все це в пам'яті досить нерозумно.

7
@nocomprende Ні, база даних зазвичай не є частиною вашого веб-сервера. Так, зберігання стану в базі даних цілком можливо обмежує масштабованість загальної програми, але є порівняно мало додатків, які можуть вивантажити весь їх стан (або навіть усі стан "на користувача") на клієнта. Сервери баз даних спеціально розроблені для масштабного управління станом, і, як зазначає CandiedOrange, вони, як правило, краще захищені, оснащені та перевірені, ніж веб-сервери. Є користь, коли можна легко масштабувати веб-сервери, хоча це не вирішує всіх проблем зі масштабуванням.
Дерек Елкінс

9
@nocomprende: Справа в тому, що база даних не є частиною веб-сервера - це те, що ви можете мати єдину базу даних (або кластер бази даних) для 1, 2, 3, .... веб-серверів. Ось так, як стан без громадянства має на меті збільшити масштабованість: ви можете самостійно масштабувати кластер бази даних та кількість веб-серверів.
Матьє М.

6
"Це правда, що веб-додатки повинні бути без громадянства." Ні. Це повна дурниця.
svidgen

4
Ця відповідь мені подобається найкраще, тому що вона найкраще ілюструє використання "без громадянства" у веб-розробниках. Сервер не підтримує стан між запитами. Весь стан повинен надходити від клієнта (тобто, частини запиту) або з бази даних (можливо, виходячи з запиту). Крім того, у веб-додатку часто є певний стан (наприклад, статичні екземпляри матеріалів), але в цілому ви хочете спроектувати речі без стану. Ця відповідь здається кращою, ніж прийнята, оскільки насправді найкраще пояснює ідею безгромадянства.
Кет

30

веб-додатки повинні бути без громадянства

Дурниці. Веб- запити повинні бути без громадянства. Або , точніше, веб - запити є особами без громадянства.

Але сказати, що ціла заява має бути без громадянства - це повна дурниця.

кожен запит трактується як незалежна транзакція.

Так, саме . Або точніше, так, обов’язково . Через HTTP кожен запит по суті не залежить від усіх інших запитів. Додавання "репутації" до HTTP вимагає чітко визначити, зберігати та отримувати "стан" для кожного "заявки про стан". А це вимагає зусиль, зниження продуктивності та додає складності.

І з цих причин кожен запит, який може бути без громадянства, "повинен" бути без громадянства.

Як результат, слід уникати сеансу та файлів cookie (оскільки вони обидва). Кращий підхід - використання токенів

Кілька речей: Токени можна прив’язати і до пам’яті сеансу. Файли cookie не потрібно прив’язувати до пам’яті сеансу. Токени часто зберігаються у файлах cookie. І іноді сеанс - це просто правильний інструмент для роботи.

Це означає, що принаймні іноді сеанси та файли cookie є настільки ж «кращими», як жетони!

[Токени] не мають статусу, оскільки на сервері нічого не зберігається.

Ну, це все. Ось що насправді йде догма "без громадянства". Хоча, щоб бути зрозумілим, мова не йде про збереження "нічого" на сервері, це не про збереження стану сеансу на сервері.

Наприклад, моя поштова скринька Gmail знаходиться в стані. І чорт за краще краще зберігатись на сервері! Але це не стан сеансу .

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

Якщо цей стан невеликий, напевно, це нормально. У деяких випадках це дуже добре.

І, звичайно, є речі, від яких ми просто очікуємо, що вони будуть гідними ...

Як веб-додатки можуть бути без громадянства, коли є дані, які зберігаються для мого сеансу (наприклад, предмети в кошику)? Чи фактично вони десь зберігаються в базі даних, а потім періодично очищаються?

Два варіанти. Або у вас сеанс, або ви відмовляєтесь!

... Але серйозно. Ви зазвичай не зберігаєте кошик у файлі cookie. Щось схоже на кошик для покупок буде або зберігатися в "традиційному" сеансі, або буде зберігатися як Cartоб'єкт, з якимсь ідентифікатором, який сервер використовує для перетягування його в наступні запити. На кшталт .. ух ... ... помилка ... сесія.

По-справжньому серйозно: Існує велика ступінь того, що "державність" - це саме те, що ми називаємо це, коли два комунікаційних агенти можуть контекстуалізувати повідомлення в розмові. І сесія, традиційно розуміється, - це саме те, що ми зазвичай називаємо механізмом, за допомогою якого це відбувається.

Я заперечую, що незалежно від того, використовуєте ви жетони або "сеанси", для кожного запиту, який обробляє ваш сервер, вам або потрібно контекстуалізувати цей запит, щоб виконати його, або ви цього не зробите. Якщо контекст не потрібний, не виймайте його. Якщо контекст є необхідним, то краще мати його поруч!

І як відповідне питання, чи є основні веб-сайти (Amazon, Google, Facebook, Twitter тощо) фактично без громадянства? Використовують вони жетони або файли cookie (або обидва)?

Напевно, обидва. Але, загалом кажучи, вони роблять саме те, що ви робите: вони встановлюють файли cookie для ідентифікації "державних" записів у масових базах даних "сеансів".

Коли це можливо, я підозрюю, що вони переносять основні претензії на особистість у короткочасні "жетони", щоб уникнути зайвих суперечок щодо централізованого зберігання. Але той факт, що багато з цих служб дозволяють мені "вийти з усіх інших місць", є хорошим показником того, що якщо вони взагалі використовують лексеми, вони принаймні "підтримуються" напівтрадиційною сесійною моделлю .


3
Погодьтеся. Це нагадує мені ідею "непорушних даних". Якщо він незмінний, вирізьблений у скелі, не витрачайте на це комп’ютер. Нехай комп'ютери наповнюють дані! Ось чому ми їх побудували! Програми працюють з даними. Постійні дані марні.

@nocomprende FYI, я буду вносити доповнення до цього пізніше. Я відчуваю, що моя частина відповіді відсутня в основному питанні ОП. Тому що за ідеєю "заявки без громадянства" лежить законне занепокоєння. Але, відповідь по лінії, коли люди говорять , що «без громадянства», що вони мали в виду , щоб сказати 'покладається мінімально на стороні сервера сеансів.
svidgen

4
@nocomprende: незмінні структури даних - це щось інше, і це інструмент, який використовується для управління життєвими циклами об'єктів пам'яті.
whatsisname

1
Любіть свій перший рядок пояснення. Коли ми щось обговорюємо, кожен словесний вислів миттєво відмирає у небуття. Але якось ми все ще можемо вести розмову, так? Це магія!

1
@nocomprende Це цікава дискусія, але я думаю, ми не повинні продовжувати її тут.
пабрамс

14

Захоплення репутацією - це не обов'язково погано, але вам потрібно зрозуміти різницю між додатками, що належать до штатів і без громадянства. Коротше кажучи, програми, що містять стан, підтримують інформацію про поточний сеанс, а програми без громадянства - ні. Інформація, що зберігається постійно як частина облікового запису користувача, може або не може зберігатися в сеансі, але зберігання інформації, пов’язаної з обліковим записом користувача, сама по собі не робить додаток державним. Затвердження стану вимагає, щоб сервер підтримував інформацію про сеанс поточного користувача за межі того, що підтримує браузер клієнта. Наприклад, клієнт може підтвердити автентифікацію та надати йому файл cookie JSESSIONID, який він потім надсилає серверу з кожним запитом. Якщо сервер починає зберігати речі в області сеансу програми на основі цього JSESSIONID, він стає релевантним.

Без громадянства

Під статусом без громадянства ми маємо на увазі, що сервер і клієнт не підтримують поточну інформацію про сеанс користувача. Клієнт і сервер можуть використовувати певну форму маркера для аутентифікації між запитами, але інша поточна інформація не зберігається. Типовим випадком використання такого рішення може бути сайт новин, де більшість користувачів (нових споживачів) споживають інформацію, але не виробляють інформацію, яка повертається на сайт. У таких випадках веб-сайту не потрібно підтримувати інформацію про поточний сеанс користувача. Зауважте, що сайт все ще може використовувати файли cookie, щоб ідентифікувати користувача та зберігати інформацію про його користування сайтом, але це все ще може розглядатися як стан без громадянства, оскільки все записане може бути транзакційним, наприклад, за тим, яке посилання користувач натиснув, і що може бути записано сервер, але не підтримується в сеансі користувача.

Надзвичайність на сервері

На сервері великолепний додаток зберігає інформацію про стан поточних користувачів. Цей підхід, як правило, передбачає використання файлів cookie для ідентифікації системи користувача, щоб стан міг підтримуватися на сервері між запитами. Сесії можуть бути або не бути автентифікованими, залежно від контексту програми. Швидкі серверні програми пропонують перевагу кешування інформації про стан користувача на сервері, прискорення пошуку та часу відгуку сторінки. З іншого боку, зберігання інформації в межах сеансу коштує дорого, і в масштабі вона стає дуже ресурсомісткою. Він також створює потенційний вектор атаки для хакерів для спроб і викрадення ідентифікаторів сеансу та крадіжки сеансів користувачів. Державні серверні програми також мають завдання захищати сеанси користувачів від несподіваних перебоїв у роботі сервісу, наприклад, збою сервера.

Державність щодо клієнта

Використовуючи JavaScript та сучасні технології браузера, такі як sessionStorage, програма тепер може легко зберігати інформацію про стан сеансу користувача на пристрої цього користувача. Загалом, заявка все ще може вважатися справжньою, але робота з підтримання стану була перенесена на клієнта. Такий підхід має велику перевагу (для підтримуючого веб-додатка) над підтримкою стану на сервері тим, що кожен користувач фактично підтримує свій власний стан, і на серверній інфраструктурі немає навантаження. У веб-масштабі такий архітектурний вибір має величезні наслідки для витрат на обладнання та електроенергію. Це може буквально коштувати мільйонів доларів на рік, щоб підтримувати стан на сервері. Перехід до системи, що підтримує стан клієнта, може заощадити мільйони доларів на рік.

Токени проти файлів cookie

Файли cookie діють як ідентифікатори для клієнтських пристроїв / браузерів. Їх можна використовувати для зберігання будь-яких речей, але зазвичай вони зберігають певну форму ідентифікатора, наприклад CFID / CFTOKEN у додатках CFML. Файли cookie можуть бути налаштовані на тривалий час у веб-переглядачі користувача, що дозволяє робити такі дії, як підтримка автентифікації в додатку між сеансами браузера. Файли cookie також можуть бути встановлені лише в пам'яті, тому вони закінчуються, коли користувач закриває браузер.

Токени, як правило, є деякою ідентифікаційною інформацією про користувача, яка генерується на сервері (використовуючи шифрування для скремповування інформації), передається клієнту та повертається на сервер з подальшим запитом. Вони можуть бути передані у заголовку запиту та відповіді, що є загальним шаблоном для програм на одній сторінці. В ідеалі кожен запит / відповідь призводить до створення нового маркера, тому маркер не може бути перехоплений і використаний пізніше зловмисником.

Програми для однієї сторінки та стан клієнта

Завдяки SPA, державна інформація завантажується в браузер клієнта і зберігається там. Коли стан змінюється, наприклад, ви публікуєте оновлення свого облікового запису соціальних медіа, клієнт ретранслює цю нову транзакцію на сервер. У цьому випадку сервер зберігає це оновлення до постійного сховища даних, як-от база даних, і ретранслює ту інформацію, яка потрібна для клієнта, щоб йому синхронізуватись із сервером на основі оновлення (наприклад, ідентифікатор для оновлення).

Зауважте, що ця схема зберігання стану на клієнті пропонує переваги для роботи в режимі он-лайн / офлайн, оскільки ви можете бути відключені від сервера, зберігаючи при цьому дещо корисну програму. Twitter - хороший приклад цього випадку, коли ви можете переглянути будь-яку завантажену сторону клієнта у своєму каналі Twitter, навіть якщо ви відключені від програми сервера Twitter. Ця закономірність також створює складність у синхронізації між сервером і клієнтом, що є цілим предметом. Складнощі рішення - це компроміс за можливість підтримувати стан клієнта.

Захотливість клієнта змушує веб-додатків відчувати себе та вести себе як традиційні програми для настільних ПК. На відміну від додатків для настільних комп’ютерів, зазвичай у вас не буде завантажена вся інформація про ваш обліковий запис у сеансі клієнта у веб-переглядачі. Це в багатьох випадках було б непрактично і спричинило б поганий досвід. Ви можете собі уявити, що намагаєтеся завантажити цілий ящик Gmail у браузер? Натомість клієнт підтримує інформацію, наприклад, яку мітку / папку ви шукаєте та де у списку електронних листів у цій папці, яку ви шукаєте. Урівноваження того, яку державну інформацію потрібно підтримувати, і що вимагати за потреби, є ще однією інженерною проблемою цієї моделі, і, знову ж таки, це компроміс між практичністю та наданням хорошого досвіду користувача.

Візки для покупок тощо

Що стосується специфіки, як кошики для покупок, то це дійсно залежить від рішення. Кошик для покупок може зберігатися в базі даних на сервері, він може зберігатися лише в межах сеансу на сервері, а може навіть зберігатися в клієнті. В Amazon є стійкі кошики для покупок для користувачів, які ввійшли в систему, і "тимчасові" візки для анонімних користувачів, хоча ці візки певною мірою зберігаються.

Коли ви говорите про щось на кшталт Google, яке насправді є купою різних додатків, що живуть під одним і тим же брендом, вони, мабуть, не мають спільної архітектури, і кожен побудований так, як найкраще відповідає потребам своїх користувачів. Якщо ви хочете дізнатися, як будується сайт, відкрийте у своєму браузері інструменти для розробників і перегляньте його. Перевірте наявність файлів cookie, перегляньте мережевий трафік і подивіться, як він працює.

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


6

Сесій та файлів cookie не слід уникати. Ви все ще можете мати їх у веб-додатках без громадянства.

Існує велика різниця між Java та Ruby on Rails. Програми Java зберігатимуть сеанс у пам'яті за допомогою сеансового ключа, збереженого у файлі cookie. Це швидко, щоб отримати стан користувача та кошик для покупок. Однак ви завжди повинні потрапляти на один і той же сервер під час сеансу.

Програми Rails зберігають ідентифікатор користувача у підписаному, зашифрованому файлі cookie. Це не можна підробити. Коли ви завантажуєте сторінку, веб-додаток отримує ваш стан, користувача та кошик із бази даних. Це повільніше, але головне, ви можете потрапити на будь-який екземпляр ! Це дозволяє за бажанням перезапустити, масштабувати, відключати екземпляри. Дуже зручно. Це також можна зробити швидше за допомогою спільної бази даних кеш-пам'яті, на зразок Redis. Або ви можете зберігати кошик у файлі cookie, за умови, що він досить малий.

Так ви можете домогтися безгромадянства за допомогою розумних прийомів і додати можливість масштабування за бажанням.


5

Протокол є особою без громадянства.

Але з цього не обов'язково випливає, що програми, що використовують протокол, повинні бути без стану.

Ось пара пов'язаних відповідей StackOverflow, які добре пояснюють різницю:


5

Якщо мова йде про стан без громадянства - наприклад, у службі RESTful HTTP, - це уникнути збереження стану на стороні сервера. У кращому випадку, це включає також уникнення зберігання будь-якого стану в базі даних або інших стійких сховищ на бекенді. Щоб було зрозуміло, я кажу про стан, а не про дані взагалі. Здається, деякі хлопці змішують речі.

Спілкування без громадянства має ряд переваг, особливо щодо масштабованості та доступності.

Кращим підходом є використання токенів, які не мають статусу, оскільки нічого не зберігається на сервері.

Це правда (для певних протоколів аутентифікації та авторизації). Токени можуть (але не самі по собі) надавати всю інформацію в межах запиту, необхідну для автентифікації користувача або авторизації дії. Для прикладу подивіться на JWT .

Тому я намагаюся зрозуміти, як веб-додатки можуть бути без громадянства, коли є дані, які зберігаються для мого сеансу (наприклад, предмети в кошику для покупок)? Чи фактично вони десь зберігаються в базі даних, а потім періодично очищаються? Як це працює, коли ви використовуєте маркер замість файлів cookie?

Що стосується прикладу кошика для покупок Зберігати всі товари кошика на стороні клієнта без проблем, не використовуючи сеанс чи файли cookie. Ви можете знайти приклад на smashingmagazine.com . Але також можна реалізувати кошик без громадянства з файлами cookie (принаймні, якщо ваш асортимент не такий великий і 4кб пам’яті вам достатньо).

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

Як правило, жетони не використовуються для зберігання інформації, наприклад предметів кошика. Вони використовуються для автентифікації та авторизації без громадянства.

І як відповідне питання, чи є основні веб-сайти (Amazon, Google, Facebook, Twitter тощо) фактично без громадянства? Використовують вони жетони або файли cookie (або обидва)?

Якщо ви запитуєте, чи використовують вони файли cookie або маркери для автентифікації, відповідь - вони використовують обидва. Для користувачів в основному використовуються файли cookie для технічних клієнтів, в основному жетони.


-2

Гаразд, правило, яке ви цитуєте, технічно неправильне. Усі шари веб-програми мають стан.

Метою правила є "не тримати сторону сервера стану за сеансом".

Тобто, змінні сеансу в ASP , які зазвичай використовувались для виконання таких речей, як предмети в кошику / ім'я користувача тощо.

Причина полягає в тому, що у вас не вистачить пам'яті на сервері, оскільки ваша програма набирає більше користувачів. Переміщення пам’яті до бази даних або загального кешу не вирішує проблему, оскільки у вас все ще є вузьке місце.

Щоб підтримувати стан програми для кожного користувача, не зачіпаючи цю проблему, переведіть стан на сторону клієнта. Наприклад, помістіть елементи кошика у файли cookie або більш досконалі сховища на стороні клієнта.

Оскільки кількість клієнтів масштабується з кількістю користувачів, ваша програма в цілому не матиме вузького місця і буде добре масштабуватися.


2
Незважаючи на те, що витоки пам’яті та відмова в обслуговуванні були чинником, я вважаю, що найбільш важливим драйвером в даний час є еластичність та стійкість до відмови веб-сервера, що, звичайно, також пов'язано зі масштабованістю. Ідея полягає в тому, що якщо сервер перевантажений або навіть виходить з ладу, я можу просто перенаправити майбутні запити (і з трохи більшою обережністю навіть відтворити невдалі запити) на нові веб-сервери без узгодження або втрати стану (як бачить користувач).
Дерек Елкінс

хм вид. Якщо ви маєте інформацію про користувача на сервері, навіть якщо вона розповсюджується, у вас все ще виникає проблема масштабування.
Еван

Можна багато зробити, якщо витягнути дані з диска - це вузьке місце, наприклад кешування.
JeffO

ні, притаманна проблема, якщо ви зберігаєте дані за сеанс. або перенести його з веб-сервера на власну систему високої доступності, або позбутися від нього все разом, перемістивши його до клієнта
Еван

1
Вся ця дискусія про спробу уникнути гарячої картоплі дійсно мене містифікує. Що сталося зі старовинною приказкою: "Бак тут зупиняється"? Щось має керувати даними, мій банк не хотів би, щоб я зберігала всю інформацію про свої фінансові операції лише на своєму ноутбуці. Чому всі тікають від крику даних? Саме тому у нас є комп’ютери! Божевільний.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.