Қайшылықтарды анықтау және шешу
1) Қайшылықты не деп санау керек
Жанжал - бұл өзгерістердің екі немесе одан да көп көзі бір мәннің, ресурстың немесе инварианттың үйлеспейтін жағдайларына үміттенетін жағдай.
Синтаксистік: бір файл/кілттің қиылысатын өзгерістері (merge conflict в Git, patch-коллизиялар в Kustomize).
Семантикалық: схема бойынша түзетілген құжат бизнес-инвариантты бұзады (кредит ≠ дебет сомасы, лимит асып кетті).
Операциялық/уақытша: жазу/оқу жарыстары, қайталанатын оқиғалар, себеп-салдарлық байланыстардың алшақтығы.
Домендік: ресурспен бәсекелес операциялар (билетті екі рет сату, тауардың овербукі).
Міндеті: жанжалды мүмкіндігінше ерте анықтау, оның себебін түсіндіру және әрекеттердің бірін қауіпсіз таңдау: авто қалпына келтіру, ретрай, бірігу, өтемақы, эскалация.
2) Детекция механизмдері
2. 1 Нұсқалылық және жағдайларды салыстыру
ETag/If-Match в REST, rowversion/xmin в DB - lost update анықтау.
3-way merge (base, ours, theirs) - үйлеспейтін түзетулерді жарықтандыру.
Өріс/құжат бойынша Checksum/Hash - арзан салыстыру.
2. 2 Уақытша және себепті белгілер
Lamport clock: толық реті «уақыт жағынан жақын».
2. 3 Инварианттар мен шектеулер
Схемалар мен валидаторлар (JSON Schema/OpenAPI) - синтаксистік валидтілік.
Инварианттар: бірегейлік, теріс емес, теңгерім, ACL-ережелер.
Тұтастығын тексеру: FK/UNIQUE/EXCLUDE индекстер, partial constraints.
Кодтағы/саясатындағы домендік assert 'тер (OPA/Kyverno/Conftest).
2. 4 Оқиғалар ағынындағы детекция
Idempotency Key/Dedup Store (мысалы, TTL бар Redis/DB): қосарларды жарамсыз ету.
Transactional/Exactly-once стримингте: transactional id, producer epoch, консюмер-офсеттер.
Sequence gap detection: ауытқулар, қайталаулар (n, n + 1, n + 1).
2. 5 Бақылау және сигнализация
Қателер/қайшылықтар/ретрайлардың прометриялары.
3) Шешу стратегиясы
3. 1 Толық автоматты (анықтамасы бойынша қауіпсіз)
CRDT (Conflict-free Replicated Data Types): G-Counter, PN-Counter, OR-Set, LWW-Register, Map/Graph CRDT.
Үйлестірусіз конвергенция кепілдігі; жоғалту/сақтау семантикасын таңдау маңызды.
Коммутативтік операциялар: кез келген тәртіппен қолданылады (инкременттер, лог-аппендтер).
Idempotent handlers: қайталау нәтижені өзгертпейді (upsert, put-if-absent).
Құрылымдарды оңтайлы біріктіру: 'deep merge + policy' детерминирленген тәртіппен.
3. 2 Жартылай автоматты (саясатпен)
3-way merge + массив ережелері ('replace' append 'uniqueBy (key) | patchBy (key)').
LWW (Last-Write-Wins): қарапайым, бірақ себептік дұрыстықты жоғалту тәуекелі.
Көздердің артықшылықтары: «интерактивті енгізу> > дефолттар».
Бизнес-ереже: «егер лимит асып кетсе - ішінара растау/өтемақы».
3. 3 Үйлестіру
OCC/MVCC (оптимистік бұғаттау/көп нұсқалық): нұсқаларды салыстыру, ретрай.
Пессимистік бұғаттау: 'SELECT... FOR UPDATE ', бөлінген локтар (Redlock/DB-lock/etcd).
Консенсус (Raft/Paxos): бір көшбасшы тәртіпті шешеді; жанжалдар аз, баға - жасырындылық.
3. 4 Контурлы адам (HITL)
UI (әсіресе - контент, тарифтер, каталогтар).
Диффаны алдын ала қарау, саясатты түсіндіру, «ours/theirs қабылдау», «өрістерді біріктіру», «өтемақы жасау» түймешіктері.
4) Сәулет қабаттары бойынша паттерндер
4. 1 API/REST/gRPC
Optimistic concurrency: 'If-Match: <etag>', 409/412 қайшылықта клиент жаңа ETag есебімен ретраит.
Idempotency-Key в POST (төлемдер/тапсырыстар).
Семантикалық 409: себебін және ұсынылатын әрекеттерді хабарлаңыз.
4. 2 Деректер қоймасы
RDBMS: MVCC (snapshot isolation), бірегей индекстер, ішінара индекстер.
KV/Doc stores: нұсқалар/тексерулер (rev), compare-and-swap (CAS).
Мультимастер репликациясы: CRDT немесе «write to leader only» нұсқаларының сағаттарын сыни мәндерге қолданыңыз.
4. 3 Кезектер/стриминг
Exactly-once (іс жүзінде - «тиімді бір рет»): транзакциялық продюсер + атомарлық write-to-sink.
Dedup: соңғы N id, upsert/merge логикасын сақтау.
Outbox/Inbox үлгісі: оқиғаларды келісілген жариялау.
4. 4 Конфигурациялар және IaC
3-way merge GitOps, policy-gates (OPA/Kyverno) қолданғанға дейін.
Kustomize/Helm: мердждің детерминирленген стратегиялары және «белгісіз кілттерге» тыйым салу.
Terraform: «drift vs desired» қақтығыс сигналы ретінде жоспар-дифф.
5) Алгоритмдер мен мысалдар
5. 1 3-way merge (оңайлатылған)
text resolve(base, ours, theirs):
diff1 = delta(base, ours)
diff2 = delta(base, theirs)
if independent(diff1, diff2): return apply(base, diff1 ⊕ diff2)
if conflictsOnlyInArrays: return arrayPolicyMerge(...)
else:
return CONFLICT with hunks
5. REST ресурсы үшін 2 OCC
http
Client reads
GET /accounts/42 -> ETag: "v17", body: {balance: 100}
Trying to write off
PUT /accounts/42
If-Match: "v17"
{balance: 50}
If someone has managed before
HTTP/1. 1 412 Precondition Failed
{error: "version_mismatch", currentEtag: "v18"}
Клиент дельтаны қайта оқиды, өзекті жағдайға қолданады және қайталайды.
5. 3 Семантикалық қақтығыс (инвариант)
pseudo on Debit(accountId, amount):
current = read(accountId)
if current. balance - amount < 0:
return REJECT ("insufficient _ funds") # write early detection (accountId, version = current. version+1, balance=current. balance - amount)
5. 4 CRDT: OR-Set (нобай)
Элементтер бірегей tag-мен қосылады, жою - нақты tag-мен.
«add vs remove» қайшылығы тегтердің көмегімен шешіледі: remove тек көрінетін add тегтерді жояды.
6) Шешу саясаты: қалай ресімдеу керек
Сәулет доктринасында сипаттаңыз:1. Көздер реті (priority chain).
2. Деректер түрлері бойынша стратегиялар: скалярлар/нысандар/массивтер/мультимедиа.
3. Себеп моделі: сіз нұсқаларын пайдаланасыз ба, Lamport, vector clocks.
4. Жоғалту семантикасы: консенсус қажет LWW кезінде не жоғалуы мүмкін.
5. Уақытша терезелер: Дедупликация үшін TTL, демпотенттік терезелер.
6. Эскалация: авто-рұқсат тыйым салынған кезде, UI/approval талаптары.
7. Өтемақы: Инварианттарды қайта іріктеу үшін «cancel/compensate» SAGA-стратегиясы.
7) Метрика және SLO
conflicts_total{type} - түрлері бойынша жиілік.
conflicts_resolved_auto_ratio - авто-рұқсаттардың үлесі.
mean_time_to_resolution - реттеуге дейінгі орташа уақыт.
lost_update_incidents - жоғалған жаңартулардың тосын оқиғалары.
idempotency_hit_rate - іске қосылған Idempotency-кілттердің үлесі.
divergence_depth - репликалар айырмашылығының тереңдігі (нұсқалық векторлар).
SLO-мысал: «99% ≥ синтаксистік қақтығыстар HITL-ден ≤ 5 с, семантикалық - ≤ 15 минут ішінде автоматты түрде шешіледі».
8) Практикалық сценарийлер
8. 1 Төлемдер
Кілт: теңсіздік (Idempotency-Key), теңгерімдегі OCC, кері қадамдар үшін SAGA.
Жанжал: қосарлы есептен шығару → дедуп + баланс нұсқасын тексеру → ішінара өтемақы.
8. 2 Мүкәммал/билеттер
Опциялар: слотты/орынды пессимистік бұғаттау; мерзімі өтіп бара жатқан TTL бар оптимистік бронь; «compare-and-reserve» кезегі.
8. 3 Мазмұн/каталогтар
3-way merge + HITL: редактор қорытындыны таңдайды; «қауіпсіз» өрістер үшін авто-ережелер (бағаға әсер етпейтін SEO-белгілер).
8. 4 GitOps/Kubernetes
Қолданғанға дейінгі рендер және валидация; reject on unknown keys; «--force» тыйым салады.
Drift-детекция және policy-enforced кері қайту.
9) Қарсы үлгілер
LWW барлық жерде: себептерді жоғалту арқылы қарапайымдылық.
Ұқсастығы жоқ жасырын ретраялар: көшкін тәрізді телнұсқалар.
Массивтердің айқын саясатының болмауы: конфигурация нүктелерінің «тыныш» жоғалуы.
Желі үстіндегі жаһандық мьютекстер: SPOF және ұзақ блоктау.
«Соқыр» өтемақылар аудитсіз себептері: қайталама жанжалдар.
10) Енгізу чек-парағы
- Домендегі қайшылықтар мен инварианттар түрлерін анықтаңыз.
- Нұсқалық механизмін таңдаңыз (ETag/xmin/vector clock).
- Сыни POST/commands ішіндегі теңсіздікті қосыңыз.
- Мердж саясатын деректер түрлері (скалярлар/массивтер/нысандар) бойынша белгілеңіз.
- Схема валидаторларын және коммитке дейінгі домендік тексерулерді қосыңыз.
- Жанжалдар мен дабылдардың өлшемдерін теңшеңіз.
- Сыни заттар үшін - көшбасшы/консенсус немесе CRDT.
- HITL-флоу және UX (дифф, түсініктемелер, audit log).
- SLO және өтемақы рәсімдерін (SAGA) құжаттаңыз.
11) FAQ
Q: CRDT қашан таңдау керек, ал консенсус қашан?
A: CRDT eventual consistency жарамды және жоғары қолжетімділік/жергілікті жазбалар маңызды болғанда жарамды. Консенсус - қатаң инварианттар және операциялардың қатаң тәртібі (ақша балансы, қол жеткізу құқығы) бар деректер үшін.
Q: LWW жеткілікті ме?
A: Кэштер, метриктер және қайталама индекстер үшін - жиі иә. Пайдаланушылық деректер мен ақша үшін - әрқашан дерлік жоқ.
Q: Дедупликация терезесін қалай таңдауға болады?
A: Қайталап жеткізудің күтілетін ең көп кідірісіне бағдарланыңыз + желі джиттері, 3-5 × п99 қорын қосыңыз.
Q: әрқашан HITL жасау керек пе?
А: Жоқ. HITL даулы/құндық жанжалдар үшін қалдырыңыз; қалғандарын автоматтандырыңыз және логин жазыңыз.
12) Қорытынды
Тиімді детекция және жанжалдарды шешу - бұл нұсқалылық, себеп белгілерінің, инварианттар мен нақты саясаттың үйлесімі, қолайлы алгоритмдермен (CRDT/OT/OCC/MVCC/консенсус) және бақылаушылықпен толықтырылған. Қақтығыс «қалыпты» жағдай болып табылатын жүйелер қолжетімді және болжамды болып қалады; қақтығыс - «ерекшелік» жүйелері ең ыңғайсыз сәтте бұзылады. Үлгіні таңдаңыз, ережелерді рәсімдеңіз және нәтижені өлшеңіз.