<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Nasser Niazy</title>
        <link>https://virgool.io/feed/@nasservb</link>
        <description>بیش از ۱۰ سال سابقه برنامه نویسی وب و سیستم های پیچیده. معماری و رهبری پروژه های بزرگ نرم افزاری.</description>
        <language>fa</language>
        <pubDate>2026-06-16 11:49:00</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2221/avatar/QDJEnh.jpeg?height=120&amp;width=120</url>
            <title>Nasser Niazy</title>
            <link>https://virgool.io/@nasservb</link>
        </image>

                    <item>
                <title>تجربه ناموفق یک کار خارجی</title>
                <link>https://virgool.io/@nasservb/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D9%86%D8%A7%D9%85%D9%88%D9%81%D9%82-%DB%8C%DA%A9-%DA%A9%D8%A7%D8%B1-%D8%AE%D8%A7%D8%B1%D8%AC%DB%8C-dldtbkigxpsn</link>
                <description>#تجربهتجربه ناموفق یک کار خارجیحدود بهمن ماه بود که نتیجه یکی از تست هایی که انجام دادم با چراغ سبز مواجه شد و کارم که ۲۵ روز مشغول به کار شده بودم رو رها کردم و با حقوق ساعتی 24 دلار به استخدام یک شرکت آلمانی@payeverدر اومدم.همه چیز خیلی خوب داشت پیش میرفت و من نرم افزار تایم ترکر نصب کرده بودم و ساعت میزدم . روزی ۸ ساعت نرم افزار کار می کرد ولی برای هر روز یک تیکت تعریف می شد و باید همون روز تموم میشد حالا تایم اگه تموم میشد شما باید انقدر کار می کردین تا تسک دان می شد.تسک دومی که گرفتم رفع باگ از درگاه پرداخت در یک شرایط خاص بود .سورس رو بالا آوردم ولی هر کاری کردم باگ ایجاد نشد شاید ۴ روز روی شبیه سازی کار کردم و مدام به مدیر پروژه می گفتم باگ شبیه سازی نمیشه ولی قبول نمی کرد چون روی استیج باگ ایجاد می شد .من دسترسی به استیج نداشتم از یک سنیور خواستم کمکم کنه با هم استیج رو تست کردیم و بعد از باگ لاگ رو برام فرستاد دیدم از یکی از فایل هایی که سیمفونی کش می کنه داره یه فانکشن رو کال می کنه که شکل پارامتر هاش عوض شده . حدس زدم کش رو بعد از آپدیت نسخه پاک نکردن . کش رو پاک کردم ولی موقع تست دیدم استیج پایین هست .شرکت تایمر رو استوپ کرده بود چون این تیکت بیش از حد طول کشیده بود و من داشتم براشون رایگان کار می کردم. بعد از معلوم شدن ریشه مشکل تایمر من رو باز کردن و یه تسک دیگه گرفتم ولی تسک قبلی رو هم چک می کردم که اگه استیج درست شد دوباره مشکل رو چک کنم. استیج همچنان پایین بود و من چند بار درخواست استیج کردم چون کد تو لوکالم کار می کرد .تسک جدید رو بین ۴ تا ۶ روز تخمین زده بودم و خیلی خوب داشت پیش می رفتروز ۵ ام تسک بود که شرکت اکانت من رو بست و با من قطع همکاری کرد . گفتم تسک من آماده است تسک قبلی هم که فقط بررسی یه باگ بود و شبیه سازی نشد .اچ آر لاگ گیت رو چک می کرد و کاری به روند تسک ها نداشت . می گفت چیزی پوش نشده و توضیحات من در موردجنس تسک ها به جایی نرسید .پرداختی شرکت روی اکانت پایونیر انجام می شد و من حدود ۳۰ تومن برای باز کردن این اکانت هزینه کردم . حدود ۱۳۰ ساعت روی نرم افزار تایم ترکر ساعت زدم و چند روزی هم اضافه رو باید بهش اضافه کرد که نرم افزار رو بسته بودن .خلاصه برخی شرکت ها کارهای ریموت شون از جنس بردگی هست و اهمیتی به نیروی انسانی نمیدن چون به راحتی می تونن یک نفر دیگه رو جایگزین کنن .نکته هایی که به ذهن خودم میرسه اینه:اگه یه شرکتی چه ایرانی چه خارجی هیچ پروسه ای برای آنبوردینگ شما در نظر نگرفت و هیچ زمانی بابت اش اختصاص ندادن زنگ خطر هست.اگر یک شرکتی فیلتر وردی اش خیلی آسون بود زنگ خطر هست . شرکت های استاندارد معمولآ یه مرحله مصاحبه آشنایی دارن و با یه نیروی نسبتآ فنی روی سوابق شما گپ می زنیدبعد یه تسک میدنبعد یه مصاحبه فنی با جزيیات دارن که نتیجه تسک رو بررسی فنی می کننو آخر سر هم یه مصاحبه اچ آر که اصطلاحآ بهش می گن کالچرفیتاگه شرکت از تون خواست تایمر تون رو استوپ کنید ولی کار رو ادامه بدید زنگ خطر جدی هستتو این مدت تسک های جالبی رو برای خیلی از شرکت ها انجام دادم و برخی رو از مرحله فنی قبول شدم و تو مراحل بعدش گیر کردم و برخی هم تو همون فنی رد شدملیست تسک ها رو می تونید تو اکانت گیت هابم ببینیدgithub.com/nasservb&lt;br/&gt;خلاصه آخر اینکه اگه شرکت شما نیروی فنی لازم داشت به من خبر بدید ?</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Sat, 20 May 2023 08:18:18 +0330</pubDate>
            </item>
                    <item>
                <title>برای معماری یک سیستم نرم افزاری large-scale به صورت توزیع شده به چه مواردی باید توجه داشت ؟</title>
                <link>https://virgool.io/@nasservb/%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%DB%8C%DA%A9-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1%DB%8C-large-scale-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%AA%D9%88%D8%B2%DB%8C%D8%B9-%D8%B4%D8%AF%D9%87-%D8%A8%D9%87-%DA%86%D9%87-%D9%85%D9%88%D8%A7%D8%B1%D8%AF%DB%8C-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%AA%D9%88%D8%AC%D9%87-%D8%AF%D8%A7%D8%B4%D8%AA-yz7g92b2h5sk</link>
                <description>برای معماری یک سیستم نرم افزاری large-scale به صورت توزیع شده به چه مواردی باید توجه داشت ؟اگه خیلی دیتای زیادی قرار هست رد و بدل بشه به معماری#CQRSتوجه کنیدو کشینگ چند لایه و توزیع شدهقطعآ چند دیتا بیس#nosqlمی تونه قبل از کوئری روی دیتابیس اصلی کمکتون کنهدیتابیس های تایم سری رو برای لاگ لاجیکال دست کم نگیرید مثل#clickhouseیا#influxdbتوجه ویژه ای به#kubernetesو الزاماتش در معماری بکنیداگه سرعت تغییراتون توی سیستم با توجه به رشدش بالاست و نیاز به ری اکشن سریع به بازار دارید برای توسعه سریع سیستم معماری#microservicesarchitectureبسیار کمک می کنهاگر میشه سرویس بیرونی گرفت تا حد ممکن هم از سرویس هایی مثل#serverlessآمازون استفاده کنید تا روی محصول تمرکز کنید به جای زیرساختباید یک مسیج کیو خوب مثل#rabbitmqیا#apachekafkaبرای سیستمتون انتخاب کنید تا بتونید سیستم رو اسکیل کنید .از#grpcبه جای رست فول استفاده کنید</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Sun, 07 Nov 2021 11:57:41 +0330</pubDate>
            </item>
                    <item>
                <title>Rate Limit on third-party</title>
                <link>https://virgool.io/@nasservb/rate-limit-on-third-party-ayflktqpms2v</link>
                <description>اگه از یه تردپارتی دارید ای پی آی می گیرید خیلی بعیده بهتون اجازه استفاده بدون محدودیت رو بدهند چون ممکنه یه نفر رگباری استفاده کنه و بقیه نتونن استفاده کنن.تو این حالت میان و روی ای پی آی محدودیت میزارن که بهش میگنRate Limitبسته به توان سرویس های مختلف تعداد متفاوت هست که معمولآ در یک دقیقه اندازه گیری میشه .حالا برای رعایت این سقف می تونید از یک امکان جالب لاراول استفاده کنید که با ردیس پیاده شده و در صورتی که سقف پر شد جابی که می خواد ای پی آی کال بزنه رو به تاخیر بیاندازید .اسم این تابع از کلاس ردیس هست#throttleنحوه کار این تیکه کد رو در تصویر زیر قسمت اول می بینید که هر ۶۰ ثانیه اجازه ۱۰۰ تا درخواست رو میده.حالا اگه بخواید تعداد جابی که همزمان دارن اجرا میشن رو محدود کنید همین کلاس ردیس یه امکان باحال دیگه داره یه اسم :‌#funnelعملکرد این کلاس ها بسیار ساده است ولی فوق العاده کاربردی هستند .قسمت دوم عکس نحوه استفاده از این تابع رو در لاراول نشون میده.در هر دوی این توابع ورودی اول تابعthenدر صورت رعایت شرایط اجرا میشه و ورودی دوم در صورت تخلف از شرایط تابع اجرا میشه و اجرای جاب رو ۳۰ ثانیه به تاخیر می اندازهپیاده سازی این متد با ردیس در زبان های دیگه هم ساده استپیاده سازی برای دات نت:https://lnkd.in/dcHFrfnAپیاده سازی برای نود جی اس :https://lnkd.in/dHRd2uydپیاده سازی برای جاوا:https://lnkd.in/dvftiupW</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:47:16 +0330</pubDate>
            </item>
                    <item>
                <title>مفهوم single point of failure</title>
                <link>https://virgool.io/@nasservb/%D9%85%D9%81%D9%87%D9%88%D9%85-single-point-of-failure-s8ovx0niv9zm</link>
                <description>مفهومsingle point of failureدر معماری یک سیستم نرم افزاری:هر موقع یک نرم افزار به یکی از اجزای سازنده اش یا یکی از سرویس ها چنان وابسته باشه که با کرش کردن یا دان شدن اون قسمت کل سیستم غیرقابل استفاده باشه در معماری اون سیستم نقص#spofوجود داره.مثلآ اگه سرویس دیتابیس کلآ یک نود داشته باشه می تونه#spofما باشه چون اگه اون یه نود دان بشه سیستم به فنا رفته.برای حل این مشکل در سیستم های توزیع شده سعی می کنن هر سرویسی روی چند نود توزیع بشه و اجزایی مثل دیتابیس طوری انتخاب بشن که باعث این آسیب پذیری نباشن.برای مثال دیتابیس#cassandraبامعماری منحصر به فرد خودش هیچ وقت نقطه شکست سیستم ما نمیشه (البته اگه روی تعداد ۳حداقل نود توزیع و کلاستر بشه )این مفهوم کاربرد وسیعی در معماری نرم افزار و دیزاین شبکه های کامپیوتری داره.</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:45:26 +0330</pubDate>
            </item>
                    <item>
                <title>اصطلاحات مربوط به داکر به زبان ساده</title>
                <link>https://virgool.io/@nasservb/%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD%D8%A7%D8%AA-%D9%85%D8%B1%D8%A8%D9%88%D8%B7-%D8%A8%D9%87-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-e4xuxafnrxp1</link>
                <description>اصطلاحات مربوط به داکر به زبان ساده:#dockerتبدیل کامپیوتر شما به محیطی برای اجرای هر اپ بدون نصب کامل اون داخل فایل های سیستم عامل تون .اپ ها یصورت ایمیج دانلود میشن از داکر هاب و داخل کانتینر ها اجرا میشن و تغییری روی سیستم عامل شما ایجاد نمیشه.مثل ماشین مجازی هست با مصرف منابع بسیار کمتر. #imageبسته های نرم افزار های مختلف که بصورت ایزوله قابل اجرا روی هر سیستمی که از داکر پشتیبانی می کنه هستند. #containerوقتی به داکر می گید یه ایمیج رو اجرا کن یه کانتینر درست می کنه و اون ایمیج رو داخلش اجرا می کنه در نتیجه شما می تونید یه ایمیج مونگو داشته باشید ولی تعداد نامحدودی کانتینر ازش داشته باشید tagهر ایمیج یه تگ یا شناسه داره #dockerFileفایل توصیف یک ایمیج که می تونید با داکر بیلدش کنید و یه ایمیج جدید تو سیستم خودتون بسازید .ایمیج ساخته شده رو می تونید تگ بزنید و تو سایت داکر هاب پوش کنید تا بقیه هم استفاده کنند. base imageایمیج پایه ای که داکر فایل ها از اون استفاده می کنن و نرم افزار مد نظرشون رو روش نصب می کنن.(یه لینوکس محدود و کم حجم)docker deamonاجرا کننده کانتینر های داکر docker machineسیتمی که فضا و محیط (سی پی یو - رم و .. )رو برای اجرای کانتینر ها فراهم می کنه #dockerizeتبدیل اپلیکیشن به نسخه قابل اجرا با داکرdocker-compose سیستمی که می تونه یه اپ کامل رو با چندین داکر ایمیج بالا بیاره و مدیریت کنه . کل اپ تون با دیتا بیس و .. می تونه یه داکر کامپوز فایل داشته باشه و به راحتی استارتش کنید و تو محیط لوکال تون کد بزنید و تمام سیستم رو اجرا داشته باشید.#docker-swarmسیستمی سبک که می تونه پروژهای کوچیک رو تو محیط پروداکشن با داکر بالا بیاره و مدیریت کنه.#kubernetes or #k8s سیستم بسیار کامل که می تونه تمام سیستم کانتینر پایه رو روی محیط پروداکشن مدیریت کنه.بهترین گزینه موجود هست.#orchestration systemsسیستم های مدیریت محیط داکر پایه در پروداکشن مثل سوارم یا k8s#provisioningتخصیص دادن ریسورهای سیستم میزبان به کانتینر های داکر یا ماشین مجازی هاdocker registryمی تونید یه مخزن داکر ایمیج درست کنید که ایمیج هاتون اون جا پوش بشه چون داکر هاب بعضی موقع محدودیت میزاره روی تعداد دانلود و آی پی ایران#LXC(linux kernel container)امکان هسته لینوکس برای کانتینر درست کردن#namespacingامکانی از لینوکس که یک اپ رو می تونید داخل یه دایرکتوری زندانی کنید. داکر از همین امکان استفاده می کنه برای محدود کردن فایل سیستم یک ایمیج. #cgroups(control group)امکانی از لینوکس برای محدود کردن منابع سخت افزاری یک اپ .داکر از همین امکان استفاده از می کنه برای محدود کردن منابع سخت افزاری یک اپ.از کجا یاد بگیرم:فیلم آشنایی کلی با داکر توسط بنده: https://vrgl.ir/rnPEcبهترین رفرنس برای یادگیری اصولی داکر و داکر کامپوز:https://www.udemy.com/course/docker-and-kubernetes-the-complete-guide/</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:42:52 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی تخصصی معماری و تکنولوژی پیام رسان لینکداین</title>
                <link>https://virgool.io/@nasservb/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%AA%D8%AE%D8%B5%D8%B5%DB%8C-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D9%88-%D8%AA%DA%A9%D9%86%D9%88%D9%84%D9%88%DA%98%DB%8C-%D9%BE%DB%8C%D8%A7%D9%85-%D8%B1%D8%B3%D8%A7%D9%86-%D9%84%DB%8C%D9%86%DA%A9%D8%AF%D8%A7%DB%8C%D9%86-ueajshlbjq44</link>
                <description>می دونستید لینکداین با جاوا-اسکالا کد شده بخش پیامرسان-رییل تایم با فریم ورک Akka وPlay Framework کد شده معماری Event-Sourcing و از مدل  Akka Actor Model  استفاده شده . نگه داری کانشن ها روی  Couchbase  انجام میشه .  این بخش برای ارتباط با کلاینت فرانت از تکنولوژی SSE(Server Sent Event)استفاده می کنه . این تکنولوژی در همه مرورگرها (اینترنت اکسپلورر) ساپورت نمیشه . و میشه به جای اون از webSocket یا نوع پیشرفته تر اون یعنی Socket.io استفاده کرد در واقع فرق این دو این هست که SSE یک طرفه هست و کلاینت فقط به سرور گوش میده ولی WebSocketدو طرفه همزمان bidirectional هست . تیم فنی انتخاب این تکنولوژی رو سازگار بودن با مرورگرهای بیشتر عنوان کرده و قوی تر بودن WebSocket رو تایید کردند . بخش پیام رسان لینکداین از هسته کاملآ جداست و مستقل کار می کنه و برای سرعت و مقیاس پذیری با apache Kafka طراحی نشده . به خاطر همین رسیدن پیامها بین کاربران رو گارانتی نمی کنه .  در واقع هر کاربر می تونه هزاران پیام بصورت متن فیلم ، پست ، لینک و تصویر از میلیون ها نفر دریافت کنه و چون معماری بصورتی هست که سرور فرانت از بک جدا هست و هرکدام مستقلآ مقیاس پذیر هستند اگر کافکا استفاده می شد به ازای افزودن سرور جدید سرور فرانت باید میلیون ها تاپیک رو سایسکرایب می کرد و نگه داشتن این حجم عظیم از کانکشن ها سرعت و منابع سیستم رو تحت تاثیر می گذاشت. برای لود تست سیستم روشی رو استفاده کردند که نامش رو لانچ تاریک dark launch گذاشتند . در این روش یک شبیه ساز نوشته شده تا ترافیک شبیه به محیط واقعی با همون الگوی رشد تولید کنه و اون رو روی یک سیستم تک کلاستره بدون رپلیکا تست کردند .این ابزار رو با استفاده از  Akka actors  نوشته اند .  انگار که میلیون ها نفر از اندروید ، آی او اس و وب به سرور وصل شده اند و درحال استفاده هستند. مشکل اولی که بروز کرده علارقم توان بک اند در هندل کردن میلیون های کانکشن همزمان (چت یک نفر با میلیون ها نفر بصورت همزمان ) کرنل بیش از 128 کانشن همزمان رو نداشته و این مشکل با دستکاری پارامتر های سیستم عامل در مسیر /etc/sysctl.conf حل شد . مشکللاتی مثل تعداد نخ ها  و اندازه heap درJVM رو  حل کردند .سایر منابع  https://www.infoq.com/podcasts/linkedin-realtime-messaging-architecture</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:39:14 +0330</pubDate>
            </item>
                    <item>
                <title>فیلم جلسه آشنایی با داکر توسط بنده</title>
                <link>https://virgool.io/fboard/%D9%81%DB%8C%D9%84%D9%85-%D8%AC%D9%84%D8%B3%D9%87-%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%AA%D9%88%D8%B3%D8%B7-%D8%A8%D9%86%D8%AF%D9%87-kvbtmhnyvqyc</link>
                <description>فیلم جلسه آشنایی با داکر توسط بنده که در قالب تک تالک برای مجموعه سوشیانت برگزار شد.مواردی که گفته شده :‌چرا داکر ایجاد شد ؟‌شمای کلی ساختار داکرساختار هسته داکر چگونه داکر از امکانات هسته لینوکس استفاده می کند ؟‌ساختار داکر فایل داکر کامپوز چیست ؟‌ساختار فایل داکر کامپوزچطور میتوان یک ایمیج را بیلد کرد و در سایت داکر هاب پوش کرد نمایش فیلم در آپارات پ ن :‌تاریخ میلادی ۲۰۲۱ درسته</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:37:40 +0330</pubDate>
            </item>
                    <item>
                <title>عوامل تاثیر گذار در انتخاب معماری یک نرم افزار به زبان ساده</title>
                <link>https://virgool.io/@nasservb/%D8%B9%D9%88%D8%A7%D9%85%D9%84-%D8%AA%D8%A7%D8%AB%DB%8C%D8%B1-%DA%AF%D8%B0%D8%A7%D8%B1-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%DB%8C%DA%A9-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-e5xrkdbzzvpi</link>
                <description>#Availability:نرم افزار چقدر باید در دسترس باشد و تحمل دان شدن چقدر است#Reliability/ #safety:. نرم افزار چقدر باید مطمعن کار کند و پایدار باشد.هزینه خطا چقدر است؟#Testability:نرم افزار چقدر قابل تست است#Scalability:نرم افزار را تا چه حدی می توان بدون تغییر ساختار نرم افزاری گسترش داد#Security:نرم افزار چقدر امن است#Agility:چقدر تغییر نرم افزار و افزایش امکانات زمانبر است#Fault_tolerance:نرم افزار چقدر تحمل خطا و ناسازگاری دارد#Elasticity:نرم افزار چقدر قابلیت توسعه خودکار در محیط کلود را دارد (تا کجا می توان با افزایش یوزرها ماشین اضافه کرد و نرم افزار را پایدار نگه داشت)#Recoverability:چقدر طول می کشد در موقع بحران نرم افزار را به حالت پایدار برگرداند#Performance:چه تعداد از یوزر روی یک واحد سخت افزاری در واحد زمانی توسط نرم افزار قابل خدمت دهی هستند#Deployability:چقدر راحت می توان نرم افزار را نگه داری کرد و از کد به پروداکشن برد#Learnability:آموزش نرم افزار چقدر برای نیروی جدید راحت است#Continuityآیا می توان درمواقع بحران نرم افزار را ریکاور کرد#Robustnessآیا نرم افزار تحمل هر کمبودی مثل نبود اینترنت یا خرابی سخت افزار را دارد ؟‌#Configurability/ #usabilityآیا می توان به راحتی با نرم افزار کار کرد #Extensibilityچطور می توان یک قابلیت نرم افزاری جدید را به نرم افزار اضافه کرد#Installabilityدر چه محیط هایی می توان نرم افزار را نصب کرد#Leverageability/ #reusebilityچقدر می توان اجزای نرم افزار را در سایر محصولات دوباره استفاده کرد#Localizationچه تعداد زبان را می توان پشتیبانی کرد#Maintainabilityهزینه نگه داری نرم افزار چقدر است#Portabilityآیا می توان به راحتی از یک پلتفرم نرم افزار را روی پلتفرم دیگر برد#Supportabilityهزینه پشتیبانی چقدر است و چقدر قابل پشتیبانی است#Upgradeability/ #Compatibilityچقدر نسخه های نرم افزار با هم سازگار استref: Fundamentals of Software Architecture Mark Richards and Neal Ford</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:36:24 +0330</pubDate>
            </item>
                    <item>
                <title>اصطلاحات مربوط به کوبرنتیز به زبان ساده</title>
                <link>https://virgool.io/@nasservb/%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD%D8%A7%D8%AA-%D9%85%D8%B1%D8%A8%D9%88%D8%B7-%D8%A8%D9%87-%DA%A9%D9%88%D8%A8%D8%B1%D9%86%D8%AA%DB%8C%D8%B2-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-bopm1bvmxb3v</link>
                <description>اصطلاحات مربوط به کوبرنتیز به زبان ساده#minikubeمحیط کوبر رو روی سیستم لوکال شما شبیه سازی می کند#helmپکیج منیجر کوبرنتیز که کار باهاش رو خیلی آسون می کنه #clusterکامپیوتری که داره کونتیز رو اجرا می کنه#pod یه محیط که می تونه کانتینر های داکر رو تو یه کلاستر کوبرنتیز اجرا کنه.کانتینر ها مربوط به هم مثل نمونه های یه سرویس بهترین گزینه برای اجرا روی یه پاد هستند.#nodeیه ماشین که داکر روش نصب هست و می تونه چندین پاد رو داخل خودش اجرا کنه .غیر از پاد ها می تونه اجزای دیگه ای داشته باشه مثل kube proxy , kubelet#kubeletنرم افزاری که اجرای یک کانتینر داخل یک نود رو فراهم می کنه.#replicaتعداد اینستنس های یک کانتینر که توسط یه پاد اجرا میشه.kube proxyقسمتی از یک نود که نود رو به شبکه داخل کلاستر وصل می کنه.#deploymentآبجکتی از کوبرنتیز که دسته ای از پادها رو میشه باهاش مدیریت و مانیتور کرد#service هر کانتینری که داخل سوارم اجرا میشه بهش میگن یه سرویس مثل ردیس.داخل کوبرنتیز می تونه آبجکتی باشه که تایپش یکی از clusterIP,NodePort,LoadBalancer,Ingressباشه و مفهومش کلآ فرق می کنه و شبکه رو برای یک نود فراهم می کنه.#ingressقسمتی از نود که مثل کارت شبکه ترجمه آدرس بیرون نود رو با داخلش انجام میده#secretsابزاری که برای ذخیره سازی رمز عبور ها در کوبر استفاده می شه.#pvc(persistent volume claim)جزیی از کوبرنتیز که کار ذخیره سازی هرچیزی که روی دیسک ها ذخیره میشه رو انجام میده . کانتینرها می تونن این اجزا رو مونت کنن و داخلش فایل ذخیره کنن.فرقش با #PVو والیومی که داخل داکر داشتیم در پایداری دیتاهاش هست.#kubctlابزار کنترل کوبرنتیز با کامندلاین(ترمینال)#kubeadmنرم افزاری که یه ماشین رو تبدیل به یه کلاستر می کنهmaster nodeنودی که وظیفه کنترل سایر نودها رو بر عهده داره و هیچ کانتینری رو اجرا نمی کنه#statefull وقتی یه نرم افزار استیت لحظه الانش وابسته به لحظه قبلی هست مثل دیتابیس.نگه داری این سرویس ها روی کوبرنتیز سخت هست.#statelessوقتی یه نرم افزار استیت لحظه الانش وابسته به لحظه قبلی نیست مثل انجینیکس.سرویس های این شکلی راحت تر روی محیط کوبرنتیز میزبانی میشن.با اضافه کردن رپلیکا خیلی راحت میشه کانتینرهای این نوعی رو اسکیل کرد.#komposeابزاری برای افرادی که داکر کامپوز بلد هستند و می خواهند به کوبر مهاجرت کنند#MicroK8sنسخه مینیمال کوبرنتیز برای پروداکشن پروژه های کوچیک#raft یکی از الگوریتم های مهندسی که برای محیط توزیع شده استفاده میشه و نودهای روی شبکه با اون می تونن همدیگه رو پیدا کنن و یه نفر رئیس بشه و بقیه ازش پیروی کنن برای درک نحوه عملکرد این لینک ها رو ببینید :‌https://lnkd.in/dyH2ArNyhttps://raft.github.io/نود های داکر سوارم روی سرور های توزیع شده با استفاده از الگوریتمraft algorithmهمدیگر رو پیدا می کنن و تا دان شدن آخرین نود سوارم می تونه بالا بمونه و سرویس بده . این الگوریتم در دیتابیس های توزیع شده و کوبرنتیز هم کاربرد فراوونی داره.#AWS محیط آمازون برای محصولات کلود بیس#GKEسرویس مدیریت شده کوبرنیتیز روی گوگل کلاد#Azureمحیط مایکروسافت برای محصولات کلود بیسرفرنس ها : دوره دیجیتال اوشنhttps://lnkd.in/dHGj3kaجمع رفرنس ها در گیتهابhttps://lnkd.in/d5T-imiiدوره خوب ویدئویی‌:https://lnkd.in/dRwY3sa8</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:33:26 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی انواع دیتابیس ها براساس مکان و ساختار</title>
                <link>https://virgool.io/@nasservb/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D9%87%D8%A7-%D8%A8%D8%B1%D8%A7%D8%B3%D8%A7%D8%B3-%D9%85%DA%A9%D8%A7%D9%86-%D9%88-%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-dnephj7mzfvk</link>
                <description>بر اساس مکان نگهداری #Centralized databaseهسته دیتابیس روی یک ماشین قرار دارد. #Cloud databaseدیتابیس روی سرویس های ابری میزبانی می شود و پایداری آنها بسیار بالاست#Distributed databaseدیتابیس روی چند سرور توزیع شده و برحسب نوع توزیع شدگی می تواند پایداری بالایی را ارائه کند. #standaloneدیتابس کنار اپ مثل #sqlite , #access , #mssqlceبر اساس ساختار دیتا مدل#relationaldatabasesپایگاه داده های رابطه ای که مرسوم ترین نوع پایگاه داده هستند و تفاوت خیلی عظیمی بین مدل های مختلف آنها نیست و داده ها را درجدول های مربوط به هم ذخیره می کنندمثال#oracle#mssqlserver#mysql#postgresqlرا می توان اشاره کرد#nosql دیتابیس های غیررابطه ای را با این کلمه مشخص می کنند ولی دقیق نیست چون برخی از این دیتابیس ها حدودی از دستورات اس کیو ال را پشتیبانی می کنند مثل #clickhouse , #Cassandra خود دیتابیس های #nosql به دسته های زیر تقسیم می شوند#keyvalueدر این دیتابیس ها یک کلید اصلی داریم که می توانیم با این کلید یک دیتا را بازیابی کنیم. نوع دیتای مورد پشتیبانی عمومآ از نوع متنی جیسون و آرایه می باشد معروف ترین نوع این دیتابیس #redis,#dynamoاست و از اصلی ترین کاربرد آنها کش دیتای پرکاربرد روی مموری است. #column base این نوع دیتابیس ها هم همان key-value است با این تفاوت که value می تواند ساختار داشته باشد . برحسب این که ساختار آن استاتیک باشد یا داینامیک به دو نوع wide-columnمثل  #cassandra , #bigtable,#hbase, #clickhouse , #influxdb و داکیومنت بیس مثل #mongodb, #elasticsearch , #couchdb می توان تقسیم کرد.داکیومنت بیس ها هم مثل کلید ولیو هستند ولی ولیو می تواند ساختار انعطاف پذیر(بدون ساختار) داشته باشد نوع ستون مبنا تفاوت اساسی با دیتابیس رابطه ای دارد به این صورت که مثلآ در مای اس کیو ال هر جدول در یک فایل ذخیره می شود ولی در دیتابیسی مثل #clickhouse هر ستون در یک فایل ذخیره می شود . این باعث می شود این نوع از دیتابیس ها سرعت وحشتناکی در ذخیره و بازیابی دیتاها داشته باشند زیرا ذخیره و بازیابی هر دیتا می توان با تردهای موازی انجام داد ولی بزرگترین چالش در این نوع از دیتابیس ها آپدیت ودلیت دیتا می باشد به صورتی که #clickHouse از دلیت و آپدیت پشتیبانی نمی کند ! و کاسندرا آن را به سختی پیاده کرده است . در واقع دیتاهای پردازش نشده مثل لاگ ها مناسب ترین نوع دیتا برای ذخیره در دیتابیس های #column-baseاست .بطوریکه برحسب استفاده به نوع دیگری نیز تقسیم می شوند به نام #timeseries  که برای ذخیره سازی لاگ و متریک طراحی شده است و کلید این دیتاها می تواند براساس ترکیبی از زمان و هش یکی از ستون ها باشد .معمولآ حجم دیتا ذخیره شده پایین استو سرعت در ماکزیمم حالت خود است. از دیتابیس های این دسته می توان به #clickhouse, #druid, #influxdb, #pinotاشاره کرد. نوع دیگر #nosql ها دیتابیس های گراف پایه است که در آن دیتا ها روی نود ها ذخیره می شوند و بین نود ها ارتباط های متفاوت می توان تعریف کرد که ارتباط می تواند یک طرف - جهت دار / دو طرفه و وزن دار باشد . ذخیره روابط بین کاربران یک شبکه اجتماعی یا داده های ترافیکی و مسیریابی بهترین نمونه کاربرد این دیتابیس هاست #neo4j, #dgraphمقاله دیگر بنده در مورد آشنایی بیشتر با دیتابیس neo4j &lt;br/&gt;رفرنس ها Designing Data-Intensive ApplicationsDesign Patterns for Cloud-Native Applications (chapter 4,6)</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:29:54 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی انواع دیتابیس ها براساس مدل توزیع شدگی</title>
                <link>https://virgool.io/@nasservb/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D9%87%D8%A7-%D8%A8%D8%B1%D8%A7%D8%B3%D8%A7%D8%B3-%D9%85%D8%AF%D9%84-%D8%AA%D9%88%D8%B2%DB%8C%D8%B9-%D8%B4%D8%AF%DA%AF%DB%8C-gxirnvyawydr</link>
                <description>master-slaveنود ها دو نوع دارند که نوع مستر(یا مسترها) اگر دیتا را بنویسند عملیات نوشتن با موفقیت انجام شده و به کاربر اعلام می شود و نوع های اسلیو دیتا را با تاخیر می نویسند. برخی دیتابیس ها مثل کساندرا commit-log دارند که اول دیتا روی آن(روی دیسک) نوشته می شود و بعد دیتا داخل نودها بصورت دایره ای می چرخد و همه از روی کامیت لاگ می نویسند. نسخه ای از مای اس کیو ال کلاستر شده #perconaهم باینری لاگ دارد و اول دیتا روی آن نوشته می شود و سپس مستر می نویسد و به یوزر اعلام می شود که دیتا نوشته شد و همزمان اسلیو هم از روی باینری لاگ می نویسد.وجود این لاگ ها دربازیابی دیتا موقع کرش دیتابیس بسیار حیاتی است. اولین توصیه بک آپ گرفتن از این لاگ ها و بعد شروع فرآیند ریکاوری است.دیتابیسی مثل#mongodbمی تواند بار نوشتن را روی چند مستر(#primery)تقسیم کنید و یک معیار در نظر بگیرید. ولی در هنگام خواندن دیتا ها می توانید تنظیم کنید که از اسلیو(#secondary)بخواند. برخی از دیتابیس ها فقط از این نوع توزیع شدگی پشتیبانی می کنند مثل #elasticsearch, #neo4j , #mysql(#percona)نوع پایداری این دیتابیس ها #nearrealtime است چون اگر مستر از بین برود جایگزین کردن مستر با یکی از اسلیو ها تاخیر زمانی ایجاد می کند که در دیتابیس های مختلف این تاخیر زمانی متفاوت است ولی زیاد نیست.(چند ثانیه تا چند دقیقه)#maste-masterدر این نوع از توزیع شدگی تمام نسخه نسخه مستر هستند و فرقی بین آن ها نیست مثل کاسندرا .می توان بار را بین سرور های مختلف تقسیم کرد می توان دیتابیس را در چندین دیتاسنتر متفاوت نصب کرد ! ولی آپدیت نگه داشتن نسخه ها روی نتورک و نودها بار ایجاد می کند. دو الگو برای نوشتن در این نوع از توزیع شرگی مطرح است یکی با نوشته شدن دیتا در اولین نود عملیات نوشتن موفقیت آمیز بوده و دومی این عملیات تا نوشتن دیتا روی آخرین نود باید صبر کرد و اگر یک نتواند بنویسد عملیات کنسل است و همه باید رول بک کنند. #replicationروی هر نود یک نسخه های کامل از دیتابیس ذخیره کنیم. مثلآ اگه ۴ نود بهم متصل داشته باشیم ۴ نسخه از دیتابیس وجود دارد و درصورت از بین رفتن سه نود هم حتمآ دیتابیس قابل بازیابی است.#sharding:روی تعدادی از نودها نسخه های کامل از دیتابیس ذخیره کنیم . مثلآ اگه چهار نود داشته باشیم و سه تا#shardاگر دو نود رو از دست بدهیم دیتابیس حتمآ قابل بازیابی است#partitioning:تقسیم دیتاها براساس یک فاکتور مثل کشور . دراین حالت سرعت اجرای کوئری ها بسیار زیاد می شود. معیار پارتیشن بندی بسیار مهم است.#transaction:گروهی از عملیات که به هم وابسته هستند یا همه انجام می شن یا هیچ کدوم انجام نمی شنتوزیح بیشتر :https://vrgl.ir/v07Qc&lt;br/&gt;رفرنس ها Designing Data-Intensive ApplicationsDesign Patterns for Cloud-Native Applications (chapter 4,6)</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:25:07 +0330</pubDate>
            </item>
                    <item>
                <title>روش انجام دسته ای کارها</title>
                <link>https://virgool.io/@nasservb/%D8%B1%D9%88%D8%B4-%D8%A7%D9%86%D8%AC%D8%A7%D9%85-%D8%AF%D8%B3%D8%AA%D9%87-%D8%A7%DB%8C-%DA%A9%D8%A7%D8%B1%D9%87%D8%A7-vb4ucguxtyci</link>
                <description>اگر نیاز دارید که دیتاهای زیادی رو داخل دیتابیس بریزید و اون دیتا کم کم به دست میاد مثلآ با هر رکوئست قرار هست یه لاگ ثبت کنید داخل دیتا بیس یا قرار هست نوتیف های یه نفر رو هر یک ساعت یک بار براش ایمیل کنید می تونید از الگوی زیر استفاده کنید .با دستورLPUSHردیس داخل یک صف از سمت چپ یک رشته پوش می کنه این دستور یه کلید و یه رشته می گیره که می تونید دیتاتون رو بصورت جیسون داخل قسمت رشته ذخیره کنید .وقتی کش تون کم کم پر میشه می تونید برای شمردن آیتم ها از دستورLLENاستفاده کنید . موقعی که کش پر شد.(مثلآ خودتون در نظر گرفتید که تعداد آیتم ها که به ۱۰۰ رسید کش رو خالی کنید )می تونید با دستورLRANGEکش رو خالی کنید و یک اینسرت بالک درست کنید و بفرستید سمت دیتا بیس یا ایمیل تون رو بسازید و بفرستید .</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:19:56 +0330</pubDate>
            </item>
                    <item>
                <title>نحوه استفاده گروهی از یک ریسورس محدود</title>
                <link>https://virgool.io/@nasservb/%D9%86%D8%AD%D9%88%D9%87-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%AF%D8%B1%D9%88%D9%87%DB%8C-%D8%A7%D8%B2-%DB%8C%DA%A9-%D8%B1%DB%8C%D8%B3%D9%88%D8%B1%D8%B3-%D9%85%D8%AD%D8%AF%D9%88%D8%AF-pj0msysdvrj7</link>
                <description>اگه از یک ای پی آی که روش محدودیت تعداد صدا زدن داره استفاده می کنید مثل ای پی آی بانکی مکانیزم به این صورت هست که باید اول یه توکن بگیرید و تا مدت مثلآ ۱۰ دقیقه این توکن معتبر هست و تمام ای پی آی های بعدی باید با این توکن ارسال بشوند.اگه هیچ محدودیتی نزاریم توی اپلیکیشنمون اگه دو تا رکوئست هم زمان یا با فاصله زمانی کم وارد سیستم بشن هر دو همزمان اقدام به گرفتن توکن می کنن و اون توکن رو هر جا بنویسیم دومی اولی رو خراب می کنه ویکی از این رکوئست ها به دیوار می خوره . چون توکن دوم توکن اول رو باطل می کنه و درخواستهایی که با توکن باطل شده ارسال بشن به خطای عدم دسترسی می خورن.برای جلوگیری از چنین رفتاری یه قفل نرم افزاری روی ردیس ست می کنن و این قفل یه عمر مثلآ ۱۰ ثانیه ای می تونه داشته باشه .در زمانی که قفل وجود نداره اولین رکوئست قفل رو چک می کنه می بینه قفلی وجود نداره قفل رو ایجاد می کنه و وارد فرایند توکن گرفتن میشه .رکوئست های بعدی که وارد سیستم میشن قفل رو چک می کنن و چند ثانیه صبر می کنن تا قفل آزاد بشه و دوباره قفل رو چک می کنن و همین پروسه رو تا آزاد شدن قفل تکرار می کنن بعد از آزاد شدن قفل توکن رو بر می دارن و استفاده می کنن .حالا اون رکوئستی که قفل رو ایجاد کرده بانک رو صدا میزنه و توکن رو ازش می گیره .توکن رو بصورت یه کلید روی ردیس میزاره و براش عمر اکسپایر شدن تعیین می کنه.از همین ماکنیزم برای قفل کردن هر چیزی تو سیستم که درخواست براش زیاد هست و همزمان قابل استفاده نیست می تونید استفاده کنید.مثلآ قبلآ ثبت نام خودرو چنین مکانیزمی داشت که ۱۰۰ نفر ۱۰۰ نفر وارد پروسه ثبت نام می شدند و ثبت نام تا ۱۰ دقیقه قفل می شد. این پروسه با همین مکانیزم به سادگی قابل پیاده سازی است.</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:17:14 +0330</pubDate>
            </item>
                    <item>
                <title>تعریف عمق فنی و عرض فنی</title>
                <link>https://virgool.io/@nasservb/%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D8%B9%D9%85%D9%82-%D9%81%D9%86%DB%8C-%D9%88-%D8%B9%D8%B1%D8%B6-%D9%81%D9%86%DB%8C-ijigj0pwqg59</link>
                <description>محدوده سبز رنگ عمق دانش تکنیکال شماست چیزهایی هست که می دانید که می دانید . برای حفظ و نگه داری آنها باید تمرین کنیدو مدام یادآوری داشته باشید .عرض تکنیکال شما مسائلی هست که می دانید وجود دارد ولی جزئیات آن را نمی دانید.درواقع مسائلی که می دانید که نمی دانید در این دسته قرار می گیرند .به مرور و حین کار از قسمت زرد کم می شود و به قسمت سبز اضافه می شود چون مجبور می شوید موارد جدید را یاد بگیرید و استفاده کنید . اگر به محدوده سبز رنگ مدتی چیزی اضافه نشود احساس درجا زدن به شما دست می دهد .ولی مهم ترین منطقه ناحیه قرمز رنگ است محدوده ای از دانش که روح شما هم از آن خبر ندارد . این محدوده شامل مواردی هست که شما نمی دانید و نمی دانید که نمی دانید !با مطالعه خبرنامه ها و شبکه های اجتماعی و مطالب فنی جدید از قسمت قرمز کم می شود و منطقه زرد اضافه می شود .فرق بین برنامه نویسان مبتدی و خوب در اندازه #عرض_فنی آنها هست و #عمق_فنی آنها چندان فرقی ندارد. چون بعد از مدتی کار نکردن با یک دانش آن دانش از منطقه سبز خارج و وارد منطقه زرد می شود .بهترین روش توصیه شده برای افزایش عرض فنی ۲۰ دقیقه مطالعه‌ی آخرین اخبار حوزه کاریتان اول روز کاری است .البته ممکن است برخی آخر تایم بازدهی بیشتری برای مطالعه داشته باشند.ref: Fundamentals of Software Architecture Mark Richards and Neal Ford</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:13:40 +0330</pubDate>
            </item>
                    <item>
                <title>مروری سریع بر neo4j</title>
                <link>https://virgool.io/@nasservb/%D9%85%D8%B1%D9%88%D8%B1%DB%8C-%D8%B3%D8%B1%DB%8C%D8%B9-%D8%A8%D8%B1-neo4j-os640dgdkgay</link>
                <description>یک بانک اطلاعاتی گراف پایه است که جزو بانکهای اطلاعاتی no-sql طبقه بندی میشود. سرعت بسیار بالا و امکان اجرای کوئریهای پیچیده، از برجستهترین ویژگیهای این بانک اطلاعاتی است. بهترین کاربرد neo4j استفاده به عنوان مکمل برای بانک اطلاعاتیهای دیگر مثل مونگو و کاساندرا است؛ به این صورت که دیتای اصلی در دیتابیس مونگو یا کاساندرا ذخیره گردد و ایندکس این دیتاها به همراه چند پارامتر کلیدی که در کوئریها استفاده زیادی دارد در neo4j ذخیره گردد.اکثر کوئریها بر روی neo4j اجرا شوند و با استفاده از کلیدهای یافته شده، دیتای اصلی از بانک اطلاعاتی اصلی دریافت شود. این روش در پروژههای بسیار بزرگ (مثل شبکههای اجتماعی) کاربرد فراوانی دارد. همین شیوه برای استفاده از ElasticSearch نیز بسیار مرسوم است. برای آموزش نصب neo4j در ویندوز، از این لینک و در لینوکس از این لینک استفاده کنید.برای کار با neo4j آدرسhttp://127.0.0.1:7474را درمرورگر وارد کنید و سپس وارد ویرایشگر کوئری شوید. برای بار اول neo4j از شما نام کاربری و رمز عبوری را درخواست میکند. این نام و رمز عبور، هنگام نصب تعیین میشود. معمولآ نام کاربری آن neo4j است.در زیر برخی دستورات ابتدایی آن آورده شده است.ایجاد یک آبجکت و یا ویرایش آنبرای ساخت یک آبجکت و یا ویرایش آن، باید از فرم کوئری زیر استفاده کنیم. این مرحله معادل ساخت جدول در بانکهای اطلاعاتی رابطهای است.CREATE  (VariableName:objectType { guid: {keyInMainDB }, property1 :value1 ,property2 : value2 ,... )فرم زیر، هم برای ایجاد کاربرد دارد و هم برای ویرایش. چون این فرم هر دو حالت را باهم پوشش میدهد، بیشتر استفاده میشود. هر چند در مواقعی که میخواهیم تعداد زیادی دیتا وارد بانک کنیم، حالت قبل سرعت بالاتری دارد.MERGE (VariableName:objectType { guid: keyInMainDB }) SET VariableName +={property1: value1,property2: value2,...}مثال واقعی:MERGE (object:User { guid: 1353554 }) SET object +={username:&amp;quotnasser&amp;quot ,time_created: 1522480294 }در مثال بالا یک آبجکت با نوع یوزر را ایجاد کردیم. با اینکار در واقع تایپ یوزر را هم به neo4j معرفی کردیم. البته هر اسمی را میتوانیم جای یوزر بگذاریم.مقادیر عددی مستقیم، و موارد رشتهای با کوتیشن به خواص نسبت داده شدند. اسم خواص را هم ما انتخاب کردیم. علاوه بر عدد و رشته neo4j از آرایه هم به عنوان نوع داده ورودی پشتیبانی میکند.بازیابی یک آبجکتبرای بازیابی یک آبجکت، از فرم ساده زیر استفاده میشود:match (VariableName:objectType ) return VariableNameبرای بازیابی آبجکتی که در بالا درج شد، از مثال واقعی زیر استفاده میکنیم:match (object:User { guid: 1353554 }) return objectمیتوانیم برای بازیابی شرط هم تعیین کنیم:match (object:User ) where object.time_created&gt;1522480293  return objectایجاد رابطه بین دو شیءبرای ایجاد رابطه بین دو شیء، از فرم زیر استفاده میکنیم:MATCH (v1:objectType1 {guid: guid1}),
(v2:objectType2  {guid: guid2})
MERGE (v1)-[:RelationshipName]-&gt;(v2)برای مثال واقعی میتوانید حالتی را در نظر بگیرید که یک کاربر، کاربر دیگری را در شبکه اجتماعی دنبال میکند. در اینجا رابطه دنبال کردن بین دو کاربر ایجاد میشود. یا حالتی که یک فرد، یک متن یا تصویر را لایک میکند، در اینجا بین آبجکت کاربر و آن آبجکت متن یا تصویر، رابطه لایک کردن ایجاد میشود.مثال واقعی برای لایک کردن:MATCH (usr:User {guid: 1353554  }),(img:Image  {guid: 88554  })
MERGE (usr)-[:LIKE]-&gt;(img)اسم LIKE را ما بر روی این رابطه گذاشتیم و البته هر اسم دیگری را نیز میتوانستیم بگذاریم و الزامی هم برای نوشتن با حروف بزرگ نبود. فقط برای راحتتر تفکیک کردن از سایر نوع آبجکتها، این اسم را با حرف بزرگ نوشتیم .برای بازیابی کاربرهایی که مواردی را لایک کردهاند از فرم زیر استفاده میکنیم:MATCH (usr:User)-[r:LIKE]-() Return usrبرای بازیابی همه مواردی که لایک شدهاند:MATCH ()-[r:LIKE]-(n) Return nبرای بازیابی همه مواردی که یک یوزر خاص لایک کردهاست:MATCH (usr:User{guid:1353554 })-[r:LIKE]-(n) Return nبرای بازیابی دو طرفی که در رابطه LIKE شرکت داشتهاند، از فرم زیر استفاده میکنیم:MATCH p=()-[r:LIKE]-&gt;() RETURN pمیتوانید قسمت شرط را هم اضافه کنید و برای مثال همه کاربرانی را که از یک تاریخ خاص ایجاد شدهاند و چیزی را لایک کردهاند، بدست بیاورید:MATCH (usr:User )-[r:LIKE]-(n) where usr.time_created&gt;1522480293  Return usr</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 09:01:09 +0330</pubDate>
            </item>
                    <item>
                <title>مثال ساده پرداخت بانکی با استفاده از تراکنش و پروسیجر در مای اس‌ کیو ال</title>
                <link>https://virgool.io/@nasservb/%D9%85%D8%AB%D8%A7%D9%84-%D8%B3%D8%A7%D8%AF%D9%87-%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA-%D8%A8%D8%A7%D9%86%DA%A9%DB%8C-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%AA%D8%B1%D8%A7%DA%A9%D9%86%D8%B4-%D9%88-%D9%BE%D8%B1%D9%88%D8%B3%DB%8C%D8%AC%D8%B1-%D8%AF%D8%B1-%D9%85%D8%A7%DB%8C-%D8%A7%D8%B3-%DA%A9%DB%8C%D9%88-%D8%A7%D9%84-s31p4tc5jhkz</link>
                <description>برای انجام عملیاتی مثل عملیات حسابداری، نیاز به انجام پی در پی چندین دستور می‌باشد و در صورت انجام نشدن یکی از آنها، بقیه نیز نامعتبر خواهند بود که برای پیاده سازی این مکانیزم از تراکنش‌ها در بانک اطلاعاتی استفاده می‌شود. تراکنش‌ها معمولآ در بدنه‌ی توابع ذخیره شده روی بانک(stored procedure)پیاده سازی می‌شوند. برای تعریف یک پروسیجر در مای اس کیو ال من از برنامه‌یMySQL Workbenchبه شکل زیر استفاده می‌کنم. البته می‌توان دستور ایجاد تابع را از روش‌های دیگر هم اجرا کرد.در مای اس کیو ال برای تعریف یک تابع از ساختار زیر استفاده می‌کنیم :DELIMITER $$

CREATE
          DEFINER=`user_name`@`host_name`|CURRENT_USERPROCEDURE `transition_name`(

IN | OUT  | INOUT `parameter_name` type(bigint,int , ...)
)
    SQL SECURITY  DEFINER| INVOKER
transition_name: BEGIN

#----procedure_body

ENDنکات مربوط به تعریف :در قسمتDEFINER=`user_name`@`host_name`|CURRENT_USERکسی که تابع را تعریف کرده معرفی می‌شود. اگر شما برای انتقال دیتابیس از جایی به جای دیگر، از روش ایمپورت و اکسپورت استفاده کنید، اگر نام کاربری بانک شما متفاوت باشد، معمولآ این قسمت باعث خطا می‌شود؛ چون شما نمی‌توانید به نام فرد دیگری تابع بسازید. پیش فرض هم مقدارCURRENT_USERدر نظر گرفته می‌شود که همان اسم کاربری و هاست شما است.نکته بعدی : قسمتSQL SECURITY  DEFINER| INVOKERاست که استفاده کننده از پروسیجر را مشخص می‌کند. مقدارDEFINERیعنی فقط تعریف کننده حق استفاده از این پروسیجر را دارد و مقدارINVOKERیعنی هر کسی حق استفاده از این تابع را دارد .برای شرح تراکنش، مثال پرداخت بانکی را شرح می‌دهیم:DELIMITER $$

CREATE
        DEFINER=CURRENT_USERPROCEDURE `transition_pay`(
                #-----------input valueIN `pay_value` bigint,
               IN `admin_id` int,
               #-------------result codeOUT `result` bigint
)
    SQL SECURITY INVOKER
transition_pay: BEGIN
DECLARE  admin_credit DOUBLE  DEFAULT  0;
SELECT `Credit`
INTO   admin_credit
FROM  `Admin`

WHERE `Admin_id` = admin_id
#----- transaction  body
ENDدر قسمت بالا متغیری را تعریف کرده و آخرین میزان اعتبار ادمین را داخل آن قرار دادیم تا در قسمت تراکنش، مقدار پرداختی را به آن اضافه کنیم و دو باره ادمین را آپدیت کنیم.اگر بخواهیم به دلیلی قبل از رسیدن به تراکنش آن را کنسل کنیم، می‌توان از دستورLEAVEاستفاده کرد:مثال :IF admin_id=0 THEN
set result = -1 ;
#exit procedure
LEAVE transition_pay;
END IF;حال شروع تراکنش حالت ساده :START TRANSACTION;
          INSERT INTO`PayBalance` (`Value` , `Admin_id` )
                                  VALUES (pay_value,  admin_id);

          UPDATE `Admin`SET `Credit`=admin_credit + pay_value
          WHERE `admin_id`=admin_id;
COMMIT;با پایان تراکنش، تمام مقادیر به درستی در بانک ذخیره می‌گردند.حال اگر بخواهیم به دلیلی داخل تراکنش آن را لغو کنیم از دستورROLLBACKاستفاده می‌کنیم.مثال:IF pay_value=0 THEN
set result = -1 ;
#roolback procedure
ROLLBACK ;
END IF;برای اطمینان از اجرا شدن دستورات در مای اس کیو ال می‌توان ازSET autocommit = {0 | 1}نیز استفاده کرد که مقدار پیش فرض آن یک است. یعنی هر دستوری بلافاصله اجرا شود. می‌توان قبل از دستوراتی که می‌خواهیم پی در پی اجرا شوند، یک بار آن را صفر و بعد از اجرای دستورات آنرا یک کنیم.نکته آخر اینکه با استفاده ار زبان پی اچ پی هم می‌توان تراکنشی را شروع و تمام کرد و بین این دو دستورات مورد نظر را نوشت و همیشه وجود پروسیجر الزامی نیست.</description>
                <category>Nasser Niazy</category>
                <author>Nasser Niazy</author>
                <pubDate>Fri, 05 Nov 2021 08:52:41 +0330</pubDate>
            </item>
            </channel>
</rss>