برنامه نویسی

GO EVENT BUS بهترین روشهای: اجرای جفت گشاد با NSQite

اتوبوس رویداد چیست؟

Bus Event یک الگوی پیام رسانی است که به مؤلفه های مختلف یک برنامه اجازه می دهد تا از طریق مکانیسم انتشار/مشترک و بدون وابستگی مستقیم ارتباط برقرار کنند. این الگوی به ویژه برای اجرای طرح های معماری کاملاً همراه مناسب است.

چرا ما به اتوبوس رویداد احتیاج داریم؟

  1. جدا سازی: مؤلفه ها از طریق رویدادها بدون وابستگی مستقیم ارتباط برقرار می کنند
  2. قابلیت گسترش: با عضویت در رویدادهای موجود ، ویژگی های جدید را می توان به راحتی اضافه کرد
  3. حفظ قابلیت: درک و حفظ کد آسان تر می شود
  4. پردازش ناهمزمان: از رسیدگی به پیام ناهمزمان ، بهبود پاسخگویی سیستم پشتیبانی می کند

بهترین مورد تمرین: سیستم اعلان ثبت نام کاربر

پیشینه

بیایید فرض کنیم ما در حال توسعه یک سیستم تجارت الکترونیکی هستیم که در آن ثبت نام کاربر جدید نیاز دارد:

  1. ارسال ایمیل خوش آمدید
  2. ایجاد یک حساب کاربری امتیاز
  3. هل دادن اعلان های سیستم
  4. ضبط سیاهههای مربوط به رفتار کاربر

اجرای سنتی منجر به اتصال محکم بین سرویس ثبت نام و این ویژگی ها می شود و حفظ کد دشوار است.

راه حل NSQite

// Define event structure
type UserRegisteredEvent struct {
    UserID   string
    Username string
    Email    string
    Time     time.Time
}

// Email service handler
type EmailHandler struct{}

func (h *EmailHandler) HandleMessage(message *EventMessage[UserRegisteredEvent]) error {
    event := message.Body
    // Send welcome email
    return sendWelcomeEmail(event.Email)
}

// Points service handler
type PointsHandler struct{}

func (h *PointsHandler) HandleMessage(message *EventMessage[UserRegisteredEvent]) error {
    event := message.Body
    // Create user points account
    return createUserPoints(event.UserID)
}

// Registration service
const topic = "user.registered"
var publisher = NewPublisher[UserRegisteredEvent]()
func RegisterUser(username, email string) error {
    // Create user
    userID := createUser(username, email)

    // Publish user registration event
    event := UserRegisteredEvent{
        UserID:   userID,
        Username: username,
        Email:    email,
        Time:     time.Now(),
    }

    return publisher.Publish(topic, event)
}

// Main program
func main() {
    // Initialize email subscriber
    const emailChannel = "email"
    emailSub := NewSubscriber(topic, emailChannel)
    emailSub.AddConcurrentHandlers(&EmailHandler{}, 2)

    // Initialize points subscriber
    const pointsChannel = "points"
    pointsSub := NewSubscriber(topic, pointsChannel)
    pointsSub.AddConcurrentHandlers(&PointsHandler{}, 2)

    // Register new user
    RegisterUser("testuser", "test@example.com")
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

توضیح کد

  1. ما تعریف می کنیم user.registered موضوع
  2. دو کانال ایجاد کنید: email وت points
  3. هر کانال دارای مشترکان مستقل با سطح همزمانی مختلف است
  4. هنگام انتشار پیام ، آن را برای همه کانال ها تکرار می کند
  5. مشترکین در هر کانال به طور مستقل پیام های پردازش می کنند

مزایا

  1. جدا سازی: سرویس ثبت نام نیازی به دانستن منطق اطلاع رسانی خاص ندارد
  2. قابلیت گسترش: اضافه کردن روشهای جدید اعلان فقط به مصرف کنندگان جدید نیاز دارد
  3. قابلیت اطمینان: NSQite تحویل پیام در یک پس از آن را تضمین می کند
  4. عمل: از پردازش همزمان ، بهبود توان سیستم پشتیبانی می کند

خلاصه

اصول طراحی اتوبوس رویداد NSQite

NSQite از دو بخش تشکیل شده است: اتوبوس رویداد و صف پیام معامله. این طرح از فلسفه NSQ الهام گرفته شده است. اتوبوس رویداد برای معماری های یکپارچه مناسب است ، در حالی که صف پیام معامله ای برای پروژه های اولیه ایده آل است که ممکن است شما به سیستم های بزرگ صف پیام مانند NSQ یا Pulsar احتیاج نداشته باشید.

این مکانیزم توزیع پیام دو سطحی را با موضوع و کانال پیاده سازی می کند:

  1. موضوع: طبقه بندی پیام ، جایی که یک موضوع می تواند حاوی چندین کانال باشد
  2. کانال: پیام ها به همه کانال ها تکرار می شوند
  3. مشترک: مشترکین می توانند برای پردازش سریع پیام های کانال ، Goroutines همزمان را شروع کنند

مزایای اصلی این طرح:

  • پیام ها را می توان به طور موازی توسط انواع مختلفی از مصرف کنندگان پردازش کرد
  • هر کانال می تواند به طور مستقل سطح همزمانی خود را تعیین کند
  • از ارتباطات پخش و نقطه به نقطه پشتیبانی می کند
  • تعادل بار ساده را پیاده سازی می کند

استفاده از github.com/ixugo/nsqite برای اجرای الگوی اتوبوس رویداد به ما کمک می کند تا معماری های سیستم انعطاف پذیر و قابل حفظ تری بسازیم. اگر این پروژه را مفید دیدید ، لطفاً به آن ستاره بدهید!

URL پروژه: https://github.com/ixugo/nsqite

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا