Supervisor در الکسیر

درود خدمت شما دوستان گرامی .
یک سئوالی برای بنده پیش اومده. بر اساس صبحت های دوستان . هرجا genserver هست باید یک سوپروایزری تقریبا باشه که ریست کنه . خوب اینجا صحبت سر پروسز هست و مشکلی نیست .

مثلا پروسی ای مرد دوباره ساخته بشه

حالا سئوال اول :

من یک فایل دارم به نام Rsvp.Repo که توش کد زیر قرار گرفته

defmodule Rsvp.Repo do
	use Ecto.Repo, otp_app: :rsvp
end

برنامه نویس اومده این فایل رو قرار داده در worker

defmodule Rsvp.Application do

  use Application

  def start(_type, _args) do
import Supervisor.Spec, warn: false

children = [

  worker(Rsvp.Repo, [])
]
opts = [strategy: :one_for_one, name: Rsvp.Supervisor]
Supervisor.start_link(children, opts)
  end
end

۱ - این فایل اصلا Genserver یا در کل پروسزی توش درست نمی شه که این در قسمت worker قرار گرفته ؟

۲- آیا مثلا ما می تونیم یک فانکشن رو هم سوپروایز کنیم که چندتا عدد رو داره ضرب می کنه مثلا ؟ اصلا چرا داره این کارو می کنه ؟

۳- اگر این طوری باشه مثلا هرچیزی که شبی به دیتابیس هست رو می شه سوپروایز کرد ؟

۴. کلا چه جا هایی رو می شه در Application سوپروایز کرد ؟

اگر اطلاعات کلی تری هم در این رابطه به فکرتون می رسه راهنمایی بفرمایید ممنون می شم

سلام
در حالت کلی فقط OTP Application ها میتونن Supervise بشن
GenServer و Supervisor ها OTP Application هستن
Rsvp.Repo با
use Ecto.Repo, otp_app: :rsvp
که مکرو Ecto هست ماژول و به OTP Application تبدیل میکنه

use Application اینکارو برای Supervisor
میکنه
۱. Rsvp.Application داره Rsvp.Repo
supervise میکنه که یک worker اما اگه خودش Supervisor بود از تابع Supervisor استفاده میکرد
۲. نه فقط OTP Application http://erlang.org/doc/design_principles/applications.html
3. این Supervisor داره connection ها به دیتابیس و supervise میکنه
ارتباط با یک system خارجی که احتمال پایین رفتن داره کاندید خوبیه برای Supervisor

2 پسندیده

درود خدمت سام عزیز ,


مثال اول :

یکمی مطلب بلند هست پیشاپیش معذرت خواهی می کنم.

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

آیا شما در مثال بالا اصلا از سوپروایزر استفاده می کنید ؟ یا فقط تسک و همینطور تسک سوپروایزرش ؟ و برای درفت یک جاوااسکریپت که هر چند ثانیه یک درخواست به کنترلر بفرستد.

مثال دوم :

در شروع سرور یک فایل باید بالا بیاید که هر چند ثانیه یک بار تمام رکورد های دیتابیس را بشمارد . و بعد آخرین شمارشی که کرد بیاید تعداد کل رکورد ها را تقسیم بر ۱۰۰ عدد بکند مثلا می شود ۲۰ اندازه همین عدد تسک درست بکند مثلا
تسک اول ۱ تا ۱۰۰ تسک دوم از ۱۰۱ تا ۲۰۰ و همینطور پشت هم هر کدام برای چک کردند بروند تا ببیند آیا محصولی وجود دارد که تعداد سفارشاتش بیشتر از ۲ باشد ولی موجود نباشد و اگر پیدا کرد یک ایمیل به مدیریت ارسال کند

شما در این مثال باز چه کاری انجام می دهید . آیا بازم سوپروایزر استفاده می کنید .

در کل این مثال هارو زدم که بیشتر متوجه بشم . چون اکثر صحبت ها اینکه اگر با سرور خارجی سرکار داشتیم چنین کارو رو بکنیم ولی واقعیت امر متوجه نشدم .دقیقا کجای یک سیستم مدیریت محتوایی که دارم می نویسم بهش نیاز دارم . تصمیم دارم یک cms به صورت یک پروژه آنبرلا بسازم . به همین منظور ایده ای از سوپروایزر در اون ندارم . و همینطور چون رایگان می خوام توسعه بدمش می خوام از مشورت دوستان هم استفاده کنم به زودی یک پست هم براش می زنم جداگانه

تشکر

به روز رسانی :

پستشو زدم

قسمت آپلود به دراپ باکس یا گوگل درایو رو بیشتر توضیح بده

1 پسندیده

درود توماج جان .

کار خاصی نیست . شما فکر کنید بجای اینکه فایل در هاست خودتون قرار بدید می آیید در گوگل درایو قرار می دهید و همونجا صفحه لینک می دید .

یعنی کاربر فایل را از کامپیوترش می فرسته داخل گوگل درایو یا سیستم دیگر و اونجا لینک دانلودش قرار می گیرد .

1 پسندیده

اگر من جای شما باشم یکمی فعالیت ها رو از هم جدا میکنم و در دمین های مخصوص خودشون قرار میدم. اول باید تا جایی که میشه همه چیز رو ساده کرد.

راستی انگار elasticsearch هم به کارت میاد،

1 پسندیده

بله چینن کاری کدنظر هست ولی من بیشتر می خواستم بدونم با این مثال هایی که زدم نیاز به سوپروایزر دارم یا نه من می خوام متوجه بشم که چه زمانی سوپروایزر نیاز هست در تئوری خوبه می دونم ولی در عمل خیر … متاسفانه

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

سرور هایی که خود الستیک هم اجاره می ده متاسفانه گران هستند . پس گفتم مدتی صبر کنم تا واقعا نیاز شد بزنم . بیشتر برای جستجو هام می خواستم چون یک سایتی بود که کنسل کردم بخاطر نبود سواد در این زمینه که ۲ ملیون رکورد داشت و حدود ۱۰ ملیون رکورد آرشیو شده خریداری کرده .

یک جستجو باید تو کل این رکورد ها می رفت بعد ۱۰ نتیجه ممکن بود بیاد . متاسفانه چون ممکن بود ۱۰ تا فقط باشه و همیشه در همین مقدار بود هیچ وقت نمی شد صفحه بندی و … زیاد مانور داد بهترین پیشنهاد بهم همین الستیک بود

1 پسندیده

هرچقدر هم که برنامه ای که مینویسیم خالی از باگ‌باشه وقتی بحث ارتباط با سرویس خارجی پیش میاد امکان رخ دادن خطا به هر دلیلی ممکنه، من شخصا به فلسفه let it crash علاقه بیشتری دارم و اینکه داشتن استراتژی مدیریت پردازه ها بعد از crash کردن پردازه خیلی از مخفی کردن خطا کارآمدتره چون مثل یک شانس دوباره برای یک شروع تمیز درجریان کلی میمونه

1 پسندیده

توماج جان این شد سرویس خارجی که به نظر می یاد شما دوست دارید سوپروایزر بزنید براش . ما بقی مثال ها برای اون ها می خواهید چیکار کنید من هنوز متوجه نشدم کی باید استفاده کنم به صورت دقیق .

و همینطور چطور می خواهید ایزوله کنید وقتی ۲۰ نفر استفاده می کنند از جن سرور و همزمان دارند تصویر می فرستند اطلاعات یکی رو کسی دیگری نگیره . ؟
و در قسمت وب به نظرم کمی زمان بر هست جواب برگردن و صفحه یک بار لود شده پس به احتمال زیاد اینجا برای ارتباط با جن سرور نیاز به جاوااسکریپت هست . درسته ؟ یا راه دیگیری هست ؟
ممکن هست طرف در صفحه وجود داشته باشد و درخواستش ۳ ثانیه بعد بیایید چطور خبر پیدا کنه درخواستش انجام شده ؟
در ترمینال وقتی هست جواب اوکی شد همونجا درج می شود نیاز به رفرش صفحه و …نیست.
اینجا هم رفرش نباید باشد

من ترجیح میدم فرانت اندو بکند کاملا از هم جدا باشند و همه چیز json api باشه،
مساله ترمینال و وب رو نگرفتم

1 پسندیده

اینجوری درگیر جاوااسکریپت زیادی می شم. اگر بخوام موارد تو فکرمو پیاده کنم به نظرم و

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

وقتی عکس می زارید آپلود شما می تونید کار های دیگه ای رو بکنید و عکس بعد از چند ثانیه که آپلود شد همینجا قرار می گیرد .

یعنی بعید می دونم این چنین چیزی بخواد یک تسک بشه و بخوام درست کنم بدون جاوا اسکریپت امکان پذیر باشه

خب دلیل اینکه میگم بکند و ui کاملا جدا باشه ساده کردن همین چیزاست، لازم نیست با js کار کنید حتما، js رو بسپارید به webpack یا ابزار مشابه

1 پسندیده

من متاسفانه هنوز با مثال هایی که در پست بالا زدم هنوز نفهمیدم کجا باید از سوپروایزر استفاده کنم .:disappointed_relieved:
شما اگر بودید بر اساس مثال های بالا چیکار می کردید

شهریار جان
کلا هر قسمت کد که احتمال داره خطا داشته باشه باید supervisor داشته باشه
upload به سرور دیگه باید با supervisor انجام بشه چون احتمال اینکه سرورش down باشه هست در مثال میتونی از Task , و TaskSupervisor استفاده کنی

1 پسندیده

ممنون سام جان .

مشکل من این هست که یک چیزایی تو سوپروایزر درک نمی کنم فکر کنم .

مثلا ۱۰ نفر همزمان آپلود می کنند و یکی ممکنه ۱ ثانیه بعد یکی ۱۰ ثانیه بعد جواب آپلود موفقیت آمیز یا خطا شون بیاد اینارو چطور بیام ایزوله کنم . مثلا یا آیدی هر کاربر ؟ دیگه تو سرور هست و سشن و … هم حالیش نیست .

و در قسمت سایت اینجوری که من فهمیدم برای استفاده از سوپروایزر برای مصارف بالا یا جتی تسک یا حتی بک گراند جاب که کاربر باید جوابشو تا وقتی در صفحه هست ببینه نیاز به یک چیزی مثل جاوااسکریپت یا هر کتابخونه دارم

مثل همینجا یک عکس آپلود می کنی داخل ادیتور ادامه مطلب می ری و وسطش یک دفعه می بینی تصویر اومد بالا بدون اینکه بهش کاری داشته باشی

فکر کنم همانطور که توماج گفته من درگیر یو آی شدم ولی رفتم تو ذهنم کلا گمراهم کرده

تشکر

کار ایزوله کردن erlang داره انجام میده اگر ۱۰ فر همزمان آپلود می کنند هرکدام process جدا کار میکنن و اگر یکی از آنها خطا داشته باشه فقط process اون ریست میشه
UI الان خیلی بهش فکر نکن جواب اینه که میتونی یک socket با phoenix داشته باشی و نتیجه upload و بفرستی به کاربر

1 پسندیده

تشکر سام عزیز.

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

تشکر از دو دوست عزیز @samdvr , @toomaj

1 پسندیده

@shahryarjb سوپروایزر و نه در فانکشن Task میتونی به ساکت وصل بشی
سوپروایزر Task و فقط مدیریت میکنه

1 پسندیده

سام عزیز . ببخشید متاسفانه متوجه نشدم برادر . یعنی چی؟

پس چطور در وب سوکت از تسک و سوپروایزر استفاده کرد ؟

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

1 پسندیده