درود خدمت شما دوستان گرامی .
یک سئوالی برای بنده پیش اومده. بر اساس صبحت های دوستان . هرجا 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
لطفا تصور کنید . در موقعی که سرور استارت می خوره . مدیریت سایت به بخش ادمین سایت می ره و شروع می کنه در یک ادیتور مطلب نوشتن . حالا من می خوام هر سه ثانیه این مطلبی که داره می نویسه درفت بشه . تا در صورت قطع شدن کاربر یا هر مشکلی که برایش پیش آمد این در حافظه ای قرار بگیرد و بماند . لازم به ذکر هست در این قسمت مدیریت چند تصویر در حال آپلود هست که باید این تصاویر خودکار به وسیله یک فانکشنی تبدیل به چند تصویر با اندازه های مختلف بشند و در جاهای مختلف هاست نیز آپلود گردند ولی هیچ اختلالی هم پیش نیاید و هر کدام در یک پروسه جدا . در همین لحظه مدیریت می خواهد یک فایل در دروپ باکس یا گوگل درایوی که همین چند وقت پیش نوشتم نیز آپلود کند و آن فایل را نیز برای کاربر در همان ادیتور نمایش بگذارد که بازم در یک تسک دیگر.
آیا شما در مثال بالا اصلا از سوپروایزر استفاده می کنید ؟ یا فقط تسک و همینطور تسک سوپروایزرش ؟ و برای درفت یک جاوااسکریپت که هر چند ثانیه یک درخواست به کنترلر بفرستد.
مثال دوم :
در شروع سرور یک فایل باید بالا بیاید که هر چند ثانیه یک بار تمام رکورد های دیتابیس را بشمارد . و بعد آخرین شمارشی که کرد بیاید تعداد کل رکورد ها را تقسیم بر ۱۰۰ عدد بکند مثلا می شود ۲۰ اندازه همین عدد تسک درست بکند مثلا
تسک اول ۱ تا ۱۰۰ تسک دوم از ۱۰۱ تا ۲۰۰ و همینطور پشت هم هر کدام برای چک کردند بروند تا ببیند آیا محصولی وجود دارد که تعداد سفارشاتش بیشتر از ۲ باشد ولی موجود نباشد و اگر پیدا کرد یک ایمیل به مدیریت ارسال کند
شما در این مثال باز چه کاری انجام می دهید . آیا بازم سوپروایزر استفاده می کنید .
در کل این مثال هارو زدم که بیشتر متوجه بشم . چون اکثر صحبت ها اینکه اگر با سرور خارجی سرکار داشتیم چنین کارو رو بکنیم ولی واقعیت امر متوجه نشدم .دقیقا کجای یک سیستم مدیریت محتوایی که دارم می نویسم بهش نیاز دارم . تصمیم دارم یک cms به صورت یک پروژه آنبرلا بسازم . به همین منظور ایده ای از سوپروایزر در اون ندارم . و همینطور چون رایگان می خوام توسعه بدمش می خوام از مشورت دوستان هم استفاده کنم به زودی یک پست هم براش می زنم جداگانه
بله چینن کاری کدنظر هست ولی من بیشتر می خواستم بدونم با این مثال هایی که زدم نیاز به سوپروایزر دارم یا نه من می خوام متوجه بشم که چه زمانی سوپروایزر نیاز هست در تئوری خوبه می دونم ولی در عمل خیر … متاسفانه
elasticsearch در مورد خیلی سرچ کردم . چند تا مشکل بود خیلی ها باهاش مشکل مصرف بیش از حد منابع داشتن و همینطور برخی مواقع هم برخی ها احساس پیچیدگی بسیار شدید در پروژشون اتفاق می افتاد و از این که الکستیک فکر کنم جاواست . برای اتصالشم شاید کمی به مشکل بخورم .
سرور هایی که خود الستیک هم اجاره می ده متاسفانه گران هستند . پس گفتم مدتی صبر کنم تا واقعا نیاز شد بزنم . بیشتر برای جستجو هام می خواستم چون یک سایتی بود که کنسل کردم بخاطر نبود سواد در این زمینه که ۲ ملیون رکورد داشت و حدود ۱۰ ملیون رکورد آرشیو شده خریداری کرده .
یک جستجو باید تو کل این رکورد ها می رفت بعد ۱۰ نتیجه ممکن بود بیاد . متاسفانه چون ممکن بود ۱۰ تا فقط باشه و همیشه در همین مقدار بود هیچ وقت نمی شد صفحه بندی و … زیاد مانور داد بهترین پیشنهاد بهم همین الستیک بود
هرچقدر هم که برنامه ای که مینویسیم خالی از باگباشه وقتی بحث ارتباط با سرویس خارجی پیش میاد امکان رخ دادن خطا به هر دلیلی ممکنه، من شخصا به فلسفه let it crash علاقه بیشتری دارم و اینکه داشتن استراتژی مدیریت پردازه ها بعد از crash کردن پردازه خیلی از مخفی کردن خطا کارآمدتره چون مثل یک شانس دوباره برای یک شروع تمیز درجریان کلی میمونه
توماج جان این شد سرویس خارجی که به نظر می یاد شما دوست دارید سوپروایزر بزنید براش . ما بقی مثال ها برای اون ها می خواهید چیکار کنید من هنوز متوجه نشدم کی باید استفاده کنم به صورت دقیق .
و همینطور چطور می خواهید ایزوله کنید وقتی ۲۰ نفر استفاده می کنند از جن سرور و همزمان دارند تصویر می فرستند اطلاعات یکی رو کسی دیگری نگیره . ؟
و در قسمت وب به نظرم کمی زمان بر هست جواب برگردن و صفحه یک بار لود شده پس به احتمال زیاد اینجا برای ارتباط با جن سرور نیاز به جاوااسکریپت هست . درسته ؟ یا راه دیگیری هست ؟
ممکن هست طرف در صفحه وجود داشته باشد و درخواستش ۳ ثانیه بعد بیایید چطور خبر پیدا کنه درخواستش انجام شده ؟
در ترمینال وقتی هست جواب اوکی شد همونجا درج می شود نیاز به رفرش صفحه و …نیست.
اینجا هم رفرش نباید باشد
اینجوری درگیر جاوااسکریپت زیادی می شم. اگر بخوام موارد تو فکرمو پیاده کنم به نظرم و
منظور این هست که شما وقتی یک عکسی رو می فرستی به سرور و خودت ادامه کارتو می دی و موارد دیگه ای در صفحه انجام می دی . خوب عکس بعد از چند ثانیه مثلا تبدیل شد حالا باید در صفحه قرار بگیرد . بیاییم همین انجمن مثال بزنیم
وقتی عکس می زارید آپلود شما می تونید کار های دیگه ای رو بکنید و عکس بعد از چند ثانیه که آپلود شد همینجا قرار می گیرد .
یعنی بعید می دونم این چنین چیزی بخواد یک تسک بشه و بخوام درست کنم بدون جاوا اسکریپت امکان پذیر باشه
شهریار جان
کلا هر قسمت کد که احتمال داره خطا داشته باشه باید supervisor داشته باشه
upload به سرور دیگه باید با supervisor انجام بشه چون احتمال اینکه سرورش down باشه هست در مثال میتونی از Task , و TaskSupervisor استفاده کنی
مشکل من این هست که یک چیزایی تو سوپروایزر درک نمی کنم فکر کنم .
مثلا ۱۰ نفر همزمان آپلود می کنند و یکی ممکنه ۱ ثانیه بعد یکی ۱۰ ثانیه بعد جواب آپلود موفقیت آمیز یا خطا شون بیاد اینارو چطور بیام ایزوله کنم . مثلا یا آیدی هر کاربر ؟ دیگه تو سرور هست و سشن و … هم حالیش نیست .
و در قسمت سایت اینجوری که من فهمیدم برای استفاده از سوپروایزر برای مصارف بالا یا جتی تسک یا حتی بک گراند جاب که کاربر باید جوابشو تا وقتی در صفحه هست ببینه نیاز به یک چیزی مثل جاوااسکریپت یا هر کتابخونه دارم
مثل همینجا یک عکس آپلود می کنی داخل ادیتور ادامه مطلب می ری و وسطش یک دفعه می بینی تصویر اومد بالا بدون اینکه بهش کاری داشته باشی
فکر کنم همانطور که توماج گفته من درگیر یو آی شدم ولی رفتم تو ذهنم کلا گمراهم کرده
کار ایزوله کردن erlang داره انجام میده اگر ۱۰ فر همزمان آپلود می کنند هرکدام process جدا کار میکنن و اگر یکی از آنها خطا داشته باشه فقط process اون ریست میشه
UI الان خیلی بهش فکر نکن جواب اینه که میتونی یک socket با phoenix داشته باشی و نتیجه upload و بفرستی به کاربر
اصلا به سوکت داخل فونیکس فکر نکردم کلا یادم رفته بود . پس می شه سوپروایزر رو با سوکت متصل کرد . فکر کنم باید این قسمت رو ویدیو ببنیم . کم اطلاعاتی من در این زمینه باعث این همه سوال شده