برنامه نویسی

جستجوی ایمیل بهینه شده برای میلیون ها کاربر

سریع ، مقیاس پذیر و قابل اعتماد – چگونه می توان مشکل ثبت نام ایمیل را در مقیاس برای میلیون ها کاربر بدون به خطر انداختن عملکرد یا یکپارچگی داده ها حل کرد. ، در اینجا این معامله است.

هنگامی که با میلیون ها کاربر سر و کار دارید ، یک مشکل کوچک شروع به خوردن سیستم شما می کند – بررسی می کنید که آیا یک ایمیل از قبل وجود دارد. به نظر می رسد کوچک است ، اما اگر 10 میلیون بار این کار را انجام می دهید؟ رونق ، حافظه از بین رفته است. افت عملکرد خوب نیست

اما نگران نباشید. ما این را گرفتیم بیایید مقداری از redisbloom و postgresql را مخلوط کنیم و سیستمی بسازیم که سریع ، مقیاس پذیر باشد و تمام حافظه شما را جوید.

redisbloom: حافظه نجات دهنده احتمالی

  • راندمان حافظه: ایمیل های کامل را ذخیره نمی کند. این فقط از یک آرایه کمی و برخی از جادوی ریاضی (منطق فیلتر شکوفه) استفاده می کند. بنابراین ، 10 میلیون ایمیل = فقط حافظه 30 مگابایتی. بله شوخی نمی کند

  • دیوانه سریع: بررسی کنید که آیا یک ایمیل در زمان ثابت وجود دارد ، o (1). مثل چشمک زدن سریع.

  • سبک وزن: نیازی به ذخیره ایمیل های واقعی در Redis نیست. بار کمتر ، سرعت بیشتر. \
    نزولی؟ خوب … مثبت کاذب ممکن است (1 ~).

خنک ، اما صادقانه بگویم – 1 ٪ مثبت کاذب هنوز هم یک مشکل است. بنابراین ، هنگامی که redisbloom فکر می کند ایمیل در حال حاضر وجود دارد ، ما فقط در PostgreSQL دو بار بررسی می کنیم.

postgresql: checker double قابل اعتماد

گردش کار: چگونه همه چیز جمع می شود

  • بررسی مجدد را بررسی کنید: بررسی کنید که آیا ایمیل ممکن است وجود داشته باشد یا خیر. اگر redisbloom می گوید نه – ما خوب هستیم. به جلو حرکت کنید و ثبت نام کنید.
  • بررسی postgresql: اگر redisbloom می گوید “شاید” ، ما یک ساده اجرا می کنیم SELECT 1 در Postgres فقط برای امنیت
  • در هر دو وارد کنید: اگر ایمیل در Postgres وجود ندارد ، آن را در هر دو Postgres و redisbloom وارد کنید تا آنها را همگام نگه دارید.

چرا کار خواهد کرد

  • کارآمد: Redisbloom بیشتر چک ها را انجام می دهد. رام را نجات می دهد. فوق العاده خراب

  • اعتماد به نفس: PostgreSQL نادر کاذب نادر را به خود جلب می کند. شما 100 ٪ دقت می کنید.

  • مقیاس پذیر: با 100 یا 100 میلیون کاربر صاف کار می کند. ضد آینده

  • ایمن: ما ایمیل های هش (SHA-256) را داریم ، بنابراین داده های ساده را در هیچ کجا ذخیره نمی کنیم.

تأثیر دنیای واقعی

اگر با حدود 10 میلیون ایمیل سروکار دارید ، استفاده از Redisbloom به معنای واقعی کلمه می تواند صدها مگابایت حافظه را نجات دهد. به جای ذخیره مستقیم هر ایمیل ، redisbloom تمام این موارد را در حدود 30 مگابایت فشار می دهد. این دیوانه کارآمد است.

از طرف دیگر ، PostgreSQL هنوز کار خود را با اطمینان انجام می دهد ، اما فقط وقتی واقعاً به آن احتیاج داریم. ما برای هر چک ، پایگاه داده را چکش نمی کنیم – فقط وقتی Redisbloom “شاید” را به ما می دهد. و حتی در این صورت ، ما فقط یک سبک وزن را انتخاب می کنیم ، که بسیار سریع است و هیچ داده غیر ضروری را نمی کشد.

برای عملکرد – هر بررسی مجدد تقریباً سریع است ، مانند حدود 0.001 تا 0.005 میلی ثانیه. PostgreSQL ممکن است یک قطعه طولانی تر ، شاید 0.005 تا 0.02 میلی ثانیه طول بکشد ، اما باز هم ، این فقط برای یک تکه کوچک از چک ها است. آنها را با هم ترکیب کنید و حتی اگر 10 میلیون چک انجام دهید ، در مدت چند دقیقه انجام می شود. بنابراین ،

  • شما حافظه زیادی را ذخیره می کنید

  • شما پایگاه داده خود را با پرس و جو غیر ضروری نمی سوزانید

  • سیستم ما حتی در مقیاس عظیم سریع و تمیز می ماند.

رونق این همان معماری خوب به نظر می رسد.

SHA-256: نگه داشتن ایمیل خصوصی

ایمیل های خام را ذخیره نکنید. قبل از ذخیره هر چیزی ، ما هر ایمیل را با استفاده از SHA-256 هش می دهیم ، بنابراین حتی اگر کسی وارد DB شما شود ، آنها قادر به خواندن آدرس های ایمیل نخواهند بود. لطفاً کد زیر را بررسی کنید ، امیدوارم که این قابل درک باشد.

async function **emailExists**(email: string): Promise\ {
    const hash = hashEmail(email);
    const mightExist = await redis.bf.exists('email\_bloom', hash);
    if (!mightExist) return false;
    const res = await pg.query(
        'SELECT 1 FROM registered\_emails WHERE email\_hash = $1', \[hash]
    );
    return res.rowCount > 0;
}
حالت تمام صفحه را وارد کنید

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

async function **registerEmail**(email: string) {
    if (await emailExists(email)) {
      console.log('Email already exists.');
      return;
    }
    const hash = hashEmail(email);
    await pg.query(
       'INSERT INTO registered\_emails (email\_hash) VALUES ($1)', \[hash]
    );
    await redis.bf.add('email\_bloom', hash);
    console.log('Email registered!');

}
حالت تمام صفحه را وارد کنید

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

خلاصه

  • برای جستجوی سریع و کارآمد حافظه از redisbloom استفاده کنید.

  • برای بررسی دقیق و نهایی از PostgreSQL استفاده کنید.

  • ایمیل های خود را با SHA-256 برای حفظ حریم خصوصی هش دهید.

  • بهترین ها را از هر دو جهان بدست آورید: سرعت و صداقت.

این تنظیمات آزمایش شده توسط نبرد است. این مانند دسته کوچک موسیقی جاز کامل فست فود و سخت و سخت است. در مقیاس کار می کند ، به منابع شما احترام می گذارد و از کاربران شما محافظت می شود.

امتحانش کن مقیاس با اعتماد به نفس.

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

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

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

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