Redis дэх хамгийн бага ашиглагдсан проксийг атомикаар хуваарилах
Эрэмбэлсэн олонлог ба богино Lua скрипт ашиглан проксийн хуваарилалтын тоог ажилчдын хооронд сонгож, нэмэгдүүлнэ.
Хэд хэдэн ажилчин Redis-ээр дамжуулан нэг пулыг хуваалцах үед эрэмбэлсэн олонлог энгийн бодлогыг хэрэгжүүлж болно: хамгийн бага бүртгэгдсэн хуваарилалттай тохирох проксийг сонгох. Проксийн танигчийг гишүүн, хуваарилалтын тоог оноо болгон хадгална.
Зөвшөөрөгдсөн нийтийн хүсэлтэд үйлчилдэг пулын хувьд үнэгүй проксийн жагсаалт тухайн пулын тохирлын дүрмийн дагуу үнэлэх төгсгөлийн цэгийн нэр дэвшигчдийг өгч чадна. Тохирох гишүүдийг тохиролцсон эхлэх тоогоор эхлүүлнэ. Дараа нь сонголт ба нэмэгдлийг нэг сервер талын үйлдэл болгоно:
local chosen = redis.call('ZRANGE', KEYS[1], 0, 0)[1]
if not chosen then
return nil
end
redis.call('ZINCRBY', KEYS[1], 1, chosen)
return chosenЭрэмбэлсэн олонлогийн түлхүүрийг скриптийн цорын ганц түлхүүр аргумент болгон Redis клиентийнхээ EVAL интерфэйсээр дамжуулна. Хоосон пул null үр дүн өгөх бөгөөд програмууд хүсэлт илгээхгүйгээр шийдвэрлэх ёстой.
Яагаад хоёр командыг нэгтгэх вэ?
Тусдаа уншилт ба нэмэгдэл нь хоёр ажилчинд хэн ч шинэчлэхээс өмнө ижил минимумыг харах боломж олгоно. Redis Lua скриптийг атомикаар гүйцэтгэдэг тул өөр ажилчин энэ скриптийн уншилт ба нэмэгдлийн хооронд сонголт оруулж чадахгүй. Скриптийг богино байлга, учир нь гүйцэтгэл нь бусад Redis ажлыг блоколдог.
ZRANGE хамгийн бага оноог эхлээд буцаана; тэнцүү оноог гишүүдийн дарааллаар шийднэ, санамсаргүйгээр биш. ZINCRBY сонгосон гишүүний оноог дараагийн хуваарилалтад нэгээр нэмэгдүүлнэ.
Оноо ямар утгатайг тодорхойл
Энэ нь хуваарилалтыг тоолдог бөгөөд сүлжээний хүсэлт нь дараа нь бүтэлгүйтсэн хуваарилалтыг ч багтаана. Энэ нь хоцролт, амжилттай хүсэлт эсвэл яг одоо хийгдэж буй ажлыг хэмжихгүй. Цорын ганц тохирох гишүүнийг давтан сонгох боломжтой хэвээр; скрипт түүнийг онцгойлон хадгалахгүй.
Пулнх тохирол, бодлогын дүрмээр тохирлыг хадгал. Хэрэв гишүүнийг хасч, дараа нь сэргээвэл түүний түүхэн тоог хадгалах эсэхийг шийд. Сэргээсэн проксийг тэгээс эхлүүлэх нь түүнийг гүйцэх хооронд хуваарилалтыг түүн дээр төвлөрүүлж болно.
Хамгийн бага зэрэгцээ байдлын бодлого нь өөр амьдралын мөчлөг шаарддаг бөгөөд дуусгах, орхигдсон ажлыг шийдвэрлэх багтана. Энэ хуримтлагдсан тоологчийг тэр амьдралын мөчлөг гэж тайлбарлаж болохгүй.