Service Boundaries Part 2: Data Ownership
Servis chegaralari 2-qism: ma'lumot egaligi
Ikki oshpazni tasavvur qiling: ikkalasi ham bitta muzlatgichdan bevosita foydalansa, biri narsani olib qo'yganda ikkinchisi bexabar qoladi, va tartibsizlik boshlanadi. Yaxshi oshxonada har bir oshpazning o'z, mustaqil ombori bor, va ular bir-biridan narsa kerak bo'lsa — so'raydi, o'zi bostirib kirmaydi.
Bu — mikroservislarning eng muhim qoidalaridan biri: har bir servis o'z ma'lumotlarining yagona egasi. OrderService faqat o'zining baza jadvaliga (yoki xotirasiga) ega bo'lishi kerak, va PaymentService hech qachon to'g'ridan-to'g'ri OrderServicening bazasiga kirib, ma'lumotni o'zgartirmasligi kerak — u buni faqat OrderServicening API'si orqali so'rashi mumkin.
package main
import "fmt"
type Order struct {
ID string
Status string
}
// OrderService — order ma'lumotlarining YAGONA egasi
type OrderService struct {
orders map[string]*Order // BU XARITAGA faqat OrderService'ning o'zi to'g'ridan-to'g'ri kira oladi
}
func NewOrderService() *OrderService {
return &OrderService{orders: make(map[string]*Order)}
}
func (s *OrderService) CreateOrder(id string) *Order {
order := &Order{ID: id, Status: "pending"}
s.orders[id] = order
return order
}
// Boshqa servislar order haqida bilishi kerak bo'lsa, FAQAT shu metod orqali so'raydi
func (s *OrderService) GetOrderStatus(id string) (string, bool) {
order, ok := s.orders[id]
if !ok {
return "", false
}
return order.Status, true
}
func main() {
svc := NewOrderService()
svc.CreateOrder("ord-1")
// PaymentService bu yerda "orders" xaritasiga TO'G'RIDAN-TO'G'RI kirmaydi,
// faqat GetOrderStatus orqali so'raydi
status, _ := svc.GetOrderStatus("ord-1")
fmt.Println(status)
}orders map[string]*Order maydoni kichik harf bilan boshlangani uchun eksport qilinmagan — bu "Packages & Organization" darsida ko'rgan Go'ning o'z tamoyili, endi servis chegarasini KUCHAytirish uchun ishlatilmoqda. Boshqa hech qanday kod (hatto bir xil paket ichida bo'lsa ham, real loyihada bu odatda ALOHIDA servis, alohida jarayon bo'lardi) bu xaritaga to'g'ridan-to'g'ri kira olmaydi — faqat GetOrderStatus kabi ochiq metodlar orqali.
Bu qoidaning buzilishi ("shared database" — bir nechta servis bitta bazani baham ko'rishi) — mikroservis arxitekturasidagi eng keng tarqalgan xato hisoblanadi: agar ikkita servis bitta jadvalni to'g'ridan-to'g'ri o'zgartirsa, ular aslida mikroservis emas, balki "yashirin monolit" — chegara faqat qog'ozda bor, amalda esa yo'q.
>_ Exercise
Faqat egasi orqali ma'lumotga kirish naqshini kengaytiring.
- •GetOrderTotal(id string) (int, bool) metodini qo'shing (Order'ga Total int maydonini qo'shing)
- •"ord-1"ni Total=50000 bilan yaratib, GetOrderTotal orqali qiymatni chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Har bir servis o'z ma'lumotlarining yagona egasi bo'lishi kerak — boshqa servislar unga faqat ochiq metodlar (API) orqali murojaat qiladi, hech qachon to'g'ridan-to'g'ri ichki ma'lumot tuzilmasiga kirmaydi.
NEXT UP
HTTP Service Communication
$ go run main.go
Kodingizni ishga tushiring