Gopher Academy
3.34K subscribers
920 photos
40 videos
280 files
2K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72
Download Telegram
Gopher Academy pinned «درود به همه دوستان گوفری
تمایل دارید یه ویدیویی ضبط کنم در مورد نکات مهم و طلایی در مصاحبه های گولنگ و سیستم دیزاین؟
»
🔴چندتا مقاله جالب که امروز توی golang weekly منتشر شده

🟢 توی این مقاله میگه چرا مردم اکثر از ویژگی ورژن 1.23 ناراضی هستن و دلایلش چی می تونه باشه
🔵 https://www.gingerbill.org/article/2024/06/17/go-iterator-design/


🟢 یه سری انتی پترن های عمومی که توی وب اپلیکیشن های گولنگ باید مدنظر قرار داد
🔵 https://threedots.tech/post/common-anti-patterns-in-go-web-applications/

🟢 اگر میخوای در مورد context ها توی گولنگ بیشتر بدونی این مقاله خوبیه
🔵 https://blog.meain.io/2024/golang-context/



#golang_weekly

👑 @gopher_academy | 💸 Donate | 💋 Boost
4🕊1🏆1🍓1
اگر دنبال اطلاعاتی همچون استان ها و شهرستان های ایران به همراه مختصات جغرافیایی و پیش شماره تلفن می باشید
این گزینه خوبیه

https://github.com/shimadotdev/iran-regions/blob/main/resources/json/data.json

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍6
✍️ Massimo Dev

منظور از gRPC چیه؟

ساختار gRPC یه جور تکنولوژی و ابزار برای برنامه‌نویس‌هاست که کمک می‌کنه دو تا برنامه یا سرویس مختلف بتونن با هم حرف بزنن، حتی اگه روی سرورهای مختلفی باشن. انگار که این دو تا برنامه دارن تو یه اتاق با همدیگه صحبت می‌کنن، ولی در واقع هر کدومشون تو یه شهر دیگه‌ن.

✳️ چطوری کار می‌کنه؟

فرض کن دو تا برنامه داریم، یکی که می‌خواد یه کار خاص انجام بده و یکی دیگه که قراره اون کار رو براش انجام بده:

1. تعریف کارها:
- اول از همه، باید تعریف کنیم که چه کارهایی باید انجام بشه. مثلاً برنامه A می‌خواد از برنامه B بپرسه که "اسم من چیه؟" و برنامه B باید جواب بده "اسم تو فلانه."

2. ارتباطات رو تنظیم می‌کنیم:
- باید یه روش ارتباطی مشخص کنیم که این دو تا برنامه چجوری باید با هم حرف بزنن. اینجا از gRPC استفاده می‌کنیم که یه جور زبان مشترکه برای ارتباط بین این برنامه‌ها.

3. تولید کدهای ارتباطی:
- خود gRPC به‌صورت خودکار کدهایی رو تولید می‌کنه که این برنامه‌ها بتونن راحت با هم ارتباط برقرار کنن. این کدها مثل پل‌هایی می‌مونن که ارتباط بین دو طرف رو برقرار می‌کنن.

4. اجرای سرویس:
- حالا برنامه B که قراره جواب بده، یه سرویس رو راه میندازه و گوش به زنگ می‌شه تا وقتی برنامه A ازش سوال می‌پرسه، جواب بده.

5. فراخوانی سرویس:
- برنامه A میاد و از طریق این پل‌های ارتباطی که gRPC ساخته، سوالش رو می‌پرسه و برنامه B جوابش رو می‌ده.

🚦چرا gRPC خوبه؟

1. سریع و کارآمد:
- خود gRPC خیلی سریعه و از روش‌های پیشرفته برای ارسال و دریافت داده‌ها استفاده می‌کنه که باعث می‌شه ارتباطات سریع و بدون معطلی باشن. در واقع فشرده سازی به خاطر شیوه ارسال داده (یه جور زیپ کردن) باعث میشه خیلی سریع بفرسته اطلاعات رو.

2. پشتیبانی از زبان‌های مختلف:
- با gRPC می‌تونی برنامه‌هایی که با زبان‌های برنامه‌نویسی مختلف نوشته شدن رو به هم وصل کنی. مثلاً یه برنامه با #پایتون و یه برنامه با #جاوا .

3. کم کردن کدهای اضافی:
- خود gRPC کدهای لازم برای ارتباط رو تولید می‌کنه و نیاز نیست برنامه‌نویس‌ها خودشون این کدها رو بنویسن، که این باعث می‌شه خطاها کمتر بشن و کارها سریع‌تر پیش برن.

4. استریمینگ:
- ابزار gRPC می‌تونه داده‌ها رو به صورت پیوسته و دنباله‌دار بفرسته و بگیره، که این خیلی به درد برنامه‌هایی می‌خوره که نیاز دارن دائم اطلاعات بفرستن و بگیرن، مثل استریم‌های ویدیو.

5. سازگاری و هم‌خوانی:
- سرویس‌های gRPC راحت با هم کار می‌کنن و نیاز نیست نگرانی زیادی بابت ناسازگاری‌های مختلف داشته باشی.

به طور کلی، gRPC یه ابزار عالیه برای اینکه برنامه‌ها و سرویس‌های مختلف بتونن به راحتی و با سرعت بالا با هم ارتباط برقرار کنن، حتی اگه از زبان‌ها و تکنولوژی‌های مختلفی استفاده کنن.

#طراحی_سیستم #دیتابیس #مهندس_نرم_افزار #سرور

👑 @gopher_academy | 💸 Donate | 💋 Boost
🔥12👍3🕊1🏆1💊1
✍️ Massimo Dev
تفاوت Kafka و RabbitMQ چیه؟

🔵 کافکا یا Kafka

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

✳️ معماری کافکا بر اساس یه سرویس لاگ توزیع‌شده و پارتیشن‌بندی شده کار می‌کنه. پیام‌ها تو تاپیک‌ها (موضوعات) سازماندهی می‌شن و هر تاپیک به پارتیشن‌ها تقسیم می‌شه. تولیدکننده‌ها پیام‌ها رو به تاپیک‌ها می‌فرستن و مصرف‌کننده‌ها پیام‌ها رو از تاپیک‌ها می‌خونن.

مزایا
🔺حجم بالا: کافکا می‌تونه میلیون‌ها پیام در ثانیه رو پردازش کنه.
🔹مقیاس‌پذیری: معماری توزیع‌شده کافکا اجازه می‌ده با اضافه کردن نودها و پارتیشن‌ها مقیاس رو بالا برد.
🔹دوام: پیام‌ها روی دیسک نوشته می‌شن و بین چند نود تکرار می‌شن، پس خیلی پایدارن.
🔹پردازش استریم: کافکا با فریم‌ورک‌های پردازش استریم مثل فیلینک و استورم خوب کار می‌کنه.
🔹گروه‌های مصرف‌کننده: کافکا اجازه می‌ده چند مصرف‌کننده از یه تاپیک بخونن و بار رو به طور مساوی توزیع کنن.

معایب
🔻راه‌اندازی پیچیده: کافکا نیاز به تنظیمات و پیکربندی دقیق داره، پس راه‌اندازی اولیه‌اش پیچیده‌س.
🔻نگهداری: مدیریت و نگهداری کلاسترهای کافکا پیچیده‌س و نیاز به تخصص داره.
🔻تاخیر: کافکا بیشتر برای حجم بالا بهینه شده و ممکنه تاخیر بیشتری نسبت به بعضی سیستم‌های دیگه داشته باشه.

🔵 ربیت یا RabbitMQ
ربیت‌ام‌کیو یه بروکر پیام هست که پروتکل AMQP رو پیاده‌سازی می‌کنه.

✳️ ربیت‌ام‌کیو از معماری مبتنی بر بروکر استفاده می‌کنه که در اون تولیدکننده‌ها پیام‌ها رو به اکسچنج‌ها می‌فرستن و اکسچنج‌ها اون‌ها رو بر اساس قوانین مسیریابی به صف‌ها می‌فرستن. مصرف‌کننده‌ها پیام‌ها رو از این صف‌ها می‌خونن.

مزایا
🔹سهولت استفاده: ربیت‌ام‌کیو برای راه‌اندازی و استفاده آسونه.
🔹انعطاف‌پذیری: از چندین پروتکل پیام‌رسانی (AMQP، MQTT، STOMP) و الگوهای مختلف (pub-sub، درخواست-پاسخ) پشتیبانی می‌کنه.
🔹تاخیر پایین: ربیت‌ام‌کیو برای پیام‌رسانی با تاخیر پایین بهینه شده.
🔹تحویل قابل اعتماد: ویژگی‌هایی مثل تاییدیه پیام و ماندگاری برای اطمینان از تحویل پیام داره.

معایب
🔻مقیاس‌پذیری: ربیت‌ام‌کیو می‌تونه مقیاس افقی داشته باشه، ولی به اندازه کافکا در پردازش حجم خیلی بالا کارآمد نیست.
🔻نقطه شکست واحد یا Single Point of Failure: معماری ربیت‌ام‌کیو می‌تونه دچار نقطه شکست واحد بشه، البته کلاسترینگ می‌تونه اینو کاهش بده.
🔻عملکرد: ربیت‌ام‌کیو ممکنه تو پردازش حجم بالای پیام‌ها به اندازه کافکا کارآمد نباشه.
🔻ترتیب پیام‌ها: اطمینان از ترتیب دقیق پیام‌ها تو سناریوهای مسیریابی پیچیده می‌تونه چالش‌برانگیز باشه.

موارد استفاده هرکدوم رو در ادامه میگم:

کافکا

1. استفاده از Event Sourcing: ضبط و پردازش جریان پیوسته رویدادها.
2. جمع اوری Log Aggregation: جمع‌آوری لاگ‌ها از منابع مختلف برای نظارت و تحلیل.
3. جمع‌آوری متریک‌ها: جمع‌آوری متریک‌ها از برنامه‌های توزیع‌شده برای تحلیل در زمان واقعی.
4. خطوط داده یا Data Pipeline: انتقال حجم بالای داده بین سیستم‌ها یا مراحل پردازش.

ربیت‌ام‌کیو
1. درخواست-پاسخ: پیاده‌سازی ارتباط همزمان بین سرویس‌ها.
2. پیام‌رسانی Real-time: پیام‌رسانی با تاخیر پایین برای برنامه‌های نیازمند به‌روزرسانی‌های زمان واقعی.
3. برنامه‌های IoT: مدیریت ارتباط بین دستگاه‌های IoT و سیستم‌های پشتیبان.

مشتی باشید!

#کافکا #ربیت #سیستم_دیزاین

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍7🍾3🔥1
بهترین ابزار برای چک کردن داکر فایل از لحاظ امنیتی و لینتری
۱. Hadolint

این Hadolint یک لینتر برای Dockerfileها است که به بررسی مشکلات سینتکس، بهینه‌سازی و امنیتی فایل‌های Docker می‌پردازد.

۲. Trivy

این Trivy یک ابزار اسکن امنیتی برای کانتینرها است که به بررسی آسیب‌پذیری‌های شناخته‌شده در تصاویر Docker می‌پردازد.

۳. Docker Bench for Security

این Docker Bench for Security یک اسکریپت تست امنیتی است که به ارزیابی تنظیمات Docker در برابر بهترین شیوه‌های امنیتی پرداخته و گزارشی از نقاط ضعف موجود ارائه می‌دهد.

۴. Clair

این Clair یک ابزار تحلیل و اسکن امنیتی تصاویر کانتینری است که به شناسایی آسیب‌پذیری‌های امنیتی در تصاویر Docker می‌پردازد.

۵. Snyk

این Snyk یک ابزار اسکن امنیتی برای شناسایی و رفع آسیب‌پذیری‌های موجود در تصاویر Docker است

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍81🎉1
ابزار pgTAP یک چارچوب تست برای PostgreSQL است که به شما اجازه می‌دهد تست‌های واحدی برای دیتابیس و کوئری‌های SQL خود بنویسید. در زیر نمونه‌ای از تست pgTAP برای تست یک کوئری SQL آمده است.

نصب pgTAP
قبل از هر چیز، باید pgTAP را نصب کنید. اگر هنوز pgTAP را نصب نکرده‌اید، می‌توانید آن را با استفاده از دستورات زیر نصب کنید:

CREATE EXTENSION pgtap;

ایجاد جدول و داده‌ها
فرض کنید ما یک جدول به نام best_programmers داریم که می‌خواهیم کوئری‌های مربوط به آن را تست کنیم.

CREATE TABLE best_programmers (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
rank INTEGER NOT NULL
);

INSERT INTO best_programmers (name, rank) VALUES
('Alice', 1),
('Bob', 2),
('Charlie', 3);

نوشتن تست‌ها با pgTAP
حالا می‌توانیم تست‌های خود را با استفاده از pgTAP بنویسیم. در اینجا چند تست نمونه برای کوئری‌های SQL مختلف آورده شده است.
تست برای بررسی تعداد رکوردها:
-- Load the pgTAP functions
BEGIN;

SELECT plan(1);

-- Check the number of records in the table
SELECT hasnt_null('best_programmers', 'rank IS NOT NULL', 'All programmers have a rank');

SELECT finish();

ROLLBACK;

تست برای بررسی مقدار خاص در یک ستون:

BEGIN;

SELECT plan(1);

-- Check if 'Alice' has the rank 1
SELECT is(
(SELECT rank FROM best_programmers WHERE name = 'Alice'),
1,
'Alice should have rank 1'
);

SELECT finish();

ROLLBACK;

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

BEGIN;

SELECT plan(1);

-- Check the total number of records in the table
SELECT is(
(SELECT COUNT(*) FROM best_programmers),
3,
'Total number of programmers should be 3'
);

SELECT finish();

ROLLBACK;

تست برای بررسی کوئری پیچیده‌تر:

BEGIN;

SELECT plan(1);

-- Check if the top-ranked programmer is 'Alice'
SELECT is(
(SELECT name FROM best_programmers ORDER BY rank LIMIT 1),
'Alice',
'The top-ranked programmer should be Alice'
);

SELECT finish();

ROLLBACK;

اجرای تست‌ها
برای اجرای تست‌ها، می‌توانید از ابزار pg_prove استفاده کنید که به همراه pgTAP ارائه می‌شود. دستورات زیر را در ترمینال اجرا کنید:

pg_prove -d your_database_name your_test_file.sql


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

توضیحات:
اBEGIN و ROLLBACK: این دستورات برای اجرای تست‌ها در یک تراکنش استفاده می‌شوند تا دیتابیس شما در حین تست تغییر نکند.
اplan(n): تعداد تست‌هایی که قصد دارید اجرا کنید را مشخص می‌کند.
اis(expr, expected, message): این تابع بررسی می‌کند که نتیجه expr برابر با expected است یا نه و یک پیام مرتبط نمایش می‌دهد.
اhasnt_null(table, condition, message): این تابع بررسی می‌کند که هیچ رکوردی در جدول مشخص شده بر اساس شرط داده شده نال نباشد.
اfinish(): پایان تست‌ها را مشخص می‌کند.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍6🍓1🍾1💅1💊1
✍️در HashiCorp Vault، انواع مختلفی از داده‌های محرمانه (secrets) را می‌توان مدیریت کرد. هر نوع داده‌ی محرمانه (secret) توسط یک نوع خاص از "secret engine" مدیریت می‌شود. در زیر به بررسی برخی از انواع مهم داده‌های محرمانه در Vault و secret engine‌های مرتبط با آنها می‌پردازیم:

1. Key/Value Secrets
این نوع از داده‌های محرمانه برای ذخیره‌سازی جفت کلید/مقدار (key-value pairs) استفاده می‌شود.

Secret Engine: kv
نسخه‌ها: kv-v1 و kv-v2
کاربرد: ذخیره‌سازی تنظیمات پیکربندی، متغیرهای محیطی، و سایر داده‌های ساده.
2. Database Secrets
این نوع از داده‌های محرمانه برای مدیریت اعتبارنامه‌های دسترسی به پایگاه‌های داده استفاده می‌شود.

Secret Engine: database
کاربرد: ایجاد و مدیریت اعتبارنامه‌های موقت برای پایگاه‌های داده‌های مختلف مانند MySQL، PostgreSQL، و غیره.
3. AWS Secrets
این نوع از داده‌های محرمانه برای مدیریت اعتبارنامه‌های دسترسی به سرویس‌های AWS استفاده می‌شود.

Secret Engine: aws
کاربرد: ایجاد و مدیریت اعتبارنامه‌های IAM برای دسترسی به سرویس‌های AWS.
4. Cubbyhole Secrets
این نوع از داده‌های محرمانه برای ذخیره‌سازی داده‌هایی استفاده می‌شود که فقط برای عمر یک توکن خاص معتبر هستند.

Secret Engine: cubbyhole
کاربرد: ذخیره‌سازی داده‌های موقت و توکن‌ها.
5. PKI (Public Key Infrastructure) Secrets
این نوع از داده‌های محرمانه برای مدیریت گواهی‌نامه‌های SSL/TLS و CA (Certificate Authority) استفاده می‌شود.

Secret Engine: pki
کاربرد: ایجاد، مدیریت و امضای گواهی‌نامه‌های دیجیتال.
6. Transit Secrets
این نوع از داده‌های محرمانه برای رمزنگاری داده‌ها به صورت در حال عبور (encryption as a service) استفاده می‌شود.

Secret Engine: transit
کاربرد: رمزنگاری و رمزگشایی داده‌ها بدون ذخیره‌سازی داده‌های رمزنگاری شده.
7. Identity Secrets
این نوع از داده‌های محرمانه برای مدیریت هویت‌ها و نقش‌ها استفاده می‌شود.

Secret Engine: identity
کاربرد: ایجاد و مدیریت هویت‌ها، گروه‌ها و نقش‌ها.
8. SSH Secrets
این نوع از داده‌های محرمانه برای مدیریت کلیدهای SSH و ارائه دسترسی SSH استفاده می‌شود.

Secret Engine: ssh
کاربرد: ایجاد و مدیریت کلیدهای SSH و دسترسی SSH به سیستم‌ها.
9. TOTP (Time-based One-Time Password) Secrets
این نوع از داده‌های محرمانه برای تولید رمزهای یک‌بار مصرف مبتنی بر زمان استفاده می‌شود.

Secret Engine: totp
کاربرد: ایجاد و مدیریت رمزهای یک‌بار مصرف برای احراز هویت دو مرحله‌ای.
10. Consul Secrets
این نوع از داده‌های محرمانه برای مدیریت اعتبارنامه‌های دسترسی به Consul استفاده می‌شود.

Secret Engine: consul
کاربرد: ایجاد و مدیریت اعتبارنامه‌های موقت برای دسترسی به Consul.
11. Active Directory Secrets
این نوع از داده‌های محرمانه برای مدیریت اعتبارنامه‌های دسترسی به Active Directory استفاده می‌شود.

Secret Engine: ad
کاربرد: ایجاد و مدیریت اعتبارنامه‌های Active Directory.
هر یک از این secret engine‌ها قابلیت‌ها و تنظیمات خاص خود را دارند که به شما امکان می‌دهد داده‌های محرمانه مختلف را به صورت امن مدیریت و کنترل کنید.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍2🔥1💋1💅1
📌 Staff Software Engineer (Golang)

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: kiwi.com

📍 Location: CZECHIA

⌨️ Category: #Programming

🔗 Tags: #golang #containerization #scrum


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍5💅1
👍1🍾1💋1
✍️تفاوت‌های کلیدی context.WithTimeout و context.WithDeadline

🔻نوع ورودی زمان:

WithTimeout
یک مدت زمان (Duration) دریافت می‌کند.
WithDeadline
یک زمان مشخص (Time) دریافت می‌کند.

🔻سناریوی استفاده:

WithTimeout
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc)


برای تعیین مدت زمان ثابت از لحظه ایجاد زمینه مفید است.
🔻کاربرد اصلی:
استفاده از context.WithTimeout زمانی مناسب است که بخواهید یک مدت زمان ثابت (مانند 5 ثانیه) از زمان حال را تعیین کنید تا عملیات پس از این مدت زمان لغو شود.

🔻سناریوهای معمول:
زمانی که می‌خواهید یک عملیات شبکه‌ای یا درخواست HTTP را محدود به یک مدت زمان مشخص کنید.
برای تعیین مهلت زمانی برای انجام کارهایی که نباید بیش از یک مدت زمان مشخص طول بکشند.
مناسب برای عملیات‌هایی که مدت زمان آنها از زمان شروع عملیات محاسبه می‌شود.


WithDeadline
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc)

برای تنظیم یک زمان پایان دقیق مفید است.
🔻کاربرد اصلی:
استفاده از context.WithDeadline زمانی مناسب است که بخواهید یک زمان دقیق در آینده (مثلاً ساعت 3 بعد از ظهر) را تعیین کنید تا عملیات پس از آن زمان لغو شود.

🔻سناریوهای معمول:
زمانی که می‌خواهید یک عملیات تا یک زمان خاص در آینده به پایان برسد، مانند پایان روز کاری.
برای همگام‌سازی با زمان‌بندی‌های خارجی یا ضرب‌الاجل‌های دقیق.
مناسب برای عملیات‌هایی که زمان پایان آنها باید دقیقاً در یک زمان خاص در آینده تعیین شود.

💜جمع‌بندی
انتخاب بین context.WithTimeout و context.WithDeadline بستگی به نیاز شما دارد. اگر به یک مدت زمان ثابت برای عملیات نیاز دارید، از WithTimeout استفاده کنید. اگر نیاز دارید عملیات تا یک زمان دقیق در آینده به پایان برسد، از WithDeadline استفاده کنید.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍6🔥2🏆1
پورتو یک الگوی معماری نرم افزار مدرن است که مجموعه‌ای از دستورالعمل‌ها، اصول، و الگوها را به توسعه دهندگان ارائه می‌دهد تا کد خود را به روشی با قابلیت نگهداری و استفاده مجدد بسیار بالا سازماندهی کنند.
https://virgool.io/@pakzad/porto-oaemrj7r3h1z


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍2🏆1🍓1💋1
✍️کانال‌های بافر (buffered channels)

رای ارتباط بین گوروتین‌ها که امکان ذخیره و ارسال داده‌ها به طور همزمان و بدون مسدود کردن فرستنده را فراهم می‌کنند، تا زمانی که بافر پر شود.

🔴ویژگی‌ها و رفتار کانال‌های بافر

🔻ارسال به کانال بافر:
اگر کانال بافر پر نشده باشد، ارسال به کانال مسدود نمی‌شود.
اگر کانال بافر پر باشد، ارسال به کانال تا زمانی که فضایی آزاد شود، مسدود می‌شود.

🔻دریافت از کانال بافر:
اگر کانال بافر خالی نباشد، دریافت از کانال مسدود نمی‌شود.
اگر کانال بافر خالی باشد، دریافت از کانال تا زمانی که داده‌ای وارد شود، مسدود می‌شود.
———————————————
✍️کانال‌های بدون بافر (unbuffered channels)
انتقال داده را به صورت مستقیم و همزمان بین گوروتین‌ها ممکن می‌کنند. در کانال‌های بدون بافر، هر ارسال (send) بلافاصله باید یک دریافت (receive) متناظر داشته باشد؛ در غیر این صورت، گوروتین‌ها مسدود می‌شوند.

🔴ویژگی‌ها و رفتار کانال‌های بدون بافر

🔻ارسال به کانال بدون بافر:
اگر گیرنده‌ای وجود نداشته باشد، ارسال به کانال مسدود می‌شود تا زمانی که گیرنده‌ای برای دریافت داده آماده شود.
اگر گیرنده‌ای وجود داشته باشد، داده بلافاصله منتقل می‌شود و ارسال ادامه می‌یابد.

🔻دریافت از کانال بدون بافر:
اگر فرستنده‌ای وجود نداشته باشد، دریافت از کانال مسدود می‌شود تا زمانی که فرستنده‌ای برای ارسال داده آماده شود.
اگر فرستنده‌ای وجود داشته باشد، داده بلافاصله دریافت می‌شود و دریافت ادامه می‌یابد.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍4💋2🔥1🕊1🍾1
❇️زمان‌بندی (Cooperative Scheduling)

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

❇️ویژگی‌ها:
وظیفه محوری: هر وظیفه باید صریحاً کنترل را به زمان‌بند بازگرداند. اگر وظیفه‌ای کنترل را بازنگرداند، سیستم می‌تواند به حالت قفل (deadlock) برود.
پیچیدگی کمتر: پیاده‌سازی این روش نسبتاً ساده‌تر است زیرا نیازی به دخالت سیستم عامل برای تغییر وظایف وجود ندارد.
کنترل بیشتر: وظایف می‌توانند دقیقاً زمانی که آماده هستند، کنترل را بازگردانند، که می‌تواند برای وظایف حساس به زمان مفید باشد.

🔥معایب:
پاسخ‌دهی ضعیف: اگر وظیفه‌ای به مدت طولانی کنترل را بازنگرداند، سایر وظایف نمی‌توانند اجرا شوند، که می‌تواند منجر به کاهش کارایی شود.
پیچیدگی در مدیریت وظایف: توسعه‌دهندگان باید مطمئن شوند که هر وظیفه به موقع کنترل را بازمی‌گرداند.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍4🍾1💅1
❇️زمان‌بندی (Preemptive Scheduling)
سیستم عامل یا زمان‌بند به طور مستقل و بدون دخالت وظایف، کنترل اجرای وظایف را مدیریت می‌کند. این روش به زمان‌بند اجازه می‌دهد تا وظایف را بر اساس سیاست‌های خاص، مانند اولویت، مدت زمان اجرا یا وضعیت فعلی سیستم، پیش‌گیرانه تغییر دهد.

🔵ویژگی‌ها:
کنترل سیستم عامل: سیستم عامل می‌تواند اجرای وظایف را در هر زمان متوقف کرده و وظیفه دیگری را اجرا کند.
پاسخ‌دهی بهتر: زمان‌بند می‌تواند به سرعت به نیازهای سیستم پاسخ دهد، که منجر به افزایش کارایی و عملکرد بهتر می‌شود.
مدیریت ساده‌تر وظایف: توسعه‌دهندگان نیازی به مدیریت صریح بازگرداندن کنترل ندارند، زیرا سیستم عامل این کار را انجام می‌دهد.

🔴معایب:
پیچیدگی بیشتر: پیاده‌سازی این روش نیاز به مکانیزم‌های پیچیده‌تری برای مدیریت تغییرات وظایف دارد.
احتمال وضعیت‌های رقابتی: به دلیل تغییرات ناگهانی وظایف، وظایف باید برای شرایط رقابتی (race conditions) آماده باشند و از روش‌های همگام‌سازی مناسب استفاده کنند.

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍4🍾2💊1
نقشه راه مهندس تست نرم افزار
🔵 https://automationcamp.ir/qa-roadmap


👑 @gopher_academy | 💸 Donate | 💋 Boost
🍾3👍1
Which synchronization technique is used to wait for multiple goroutines to finish executing?
Anonymous Quiz
14%
Mutex
7%
Defer
75%
WaitGroup
4%
select
🍓6
✍️برای برقراری ارتباط بین دو سرویس با استفاده از gRPC
در زبان برنامه‌نویسی Go، باید چند مرحله اصلی را دنبال کنید. این مراحل شامل تعریف پروتکل ارتباطی، تولید کدهای gRPC، پیاده‌سازی سرور و کلاینت، و در نهایت تست ارتباط است. در زیر به تفصیل این مراحل را توضیح می‌دهم:

❇️1. تعریف پروتکل ارتباطی:
- ابتدا فایل .proto را تعریف کنید که شامل تعریف سرویس‌ها و پیام‌های مورد استفاده برای ارتباط بین دو سرویس است.
- به عنوان مثال، فایل service.proto:


    syntax = "proto3";

package mypackage;

service MyService {
rpc MyMethod (MyRequest) returns (MyResponse);
}

message MyRequest {
string message = 1;
}

message MyResponse {
string response = 1;
}

❇️2. تولید کدهای gRPC:
- با استفاده از protoc و پلاگین Go، کدهای مورد نیاز برای کلاینت و سرور را تولید کنید.
- ابتدا پلاگین gRPC برای Go را نصب کنید:


    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

- سپس دستور زیر را برای تولید کدهای Go اجرا کنید:


    protoc --go_out=. --go-grpc_out=. service.proto

❇️3. پیاده‌سازی سرور:
- کدی که سرور gRPC را پیاده‌سازی می‌کند. به عنوان مثال، در Go:


    package main

import (
"context"
"log"
"net"

"google.golang.org/grpc"
pb "path/to/your/service/package"
)

type server struct {
pb.UnimplementedMyServiceServer
}

func (s *server) MyMethod(ctx context.Context, req *pb.MyRequest) (*pb.MyResponse, error) {
return &pb.MyResponse{Response: "Hello, " + req.GetMessage()}, nil
}

func main() {
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterMyServiceServer(s, &server{})
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}

❇️4. پیاده‌سازی کلاینت:
- کدی که کلاینت gRPC را پیاده‌سازی می‌کند. به عنوان مثال، در Go:


    package main

import (
"context"
"log"
"time"

"google.golang.org/grpc"
pb "path/to/your/service/package"
)

func main() {
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewMyServiceClient(conn)

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()

r, err := c.MyMethod(ctx, &pb.MyRequest{Message: "World"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetResponse())
}

❇️5. راه‌اندازی و تست:
- ابتدا سرور را راه‌اندازی کنید و سپس کلاینت را اجرا کنید تا ارتباط بین دو سرویس برقرار شود و داده‌ها ارسال و دریافت شوند.

با این مراحل، شما می‌توانید دو سرویس را با استفاده از gRPC در زبان Go به هم متصل کنید و ارتباط سریع و کارآمدی بین آن‌ها برقرار کنید.


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍8💋42🔥1🎉1