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

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

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

ادمین:
@mrbardia72
Download Telegram
ابزار 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
✍️برای ارتباط بین دو سرویس Go با استفاده از Kafka
باید چند مرحله را طی کنید. این مراحل شامل نصب و تنظیم Kafka، ایجاد موضوعات (topics) در Kafka، نوشتن تولیدکننده (producer) و مصرف‌کننده (consumer) در Go، و اجرای سرویس‌ها است. در زیر یک راهنمای کامل برای این فرآیند آورده شده است:

❇️ 1. نصب و راه‌اندازی Kafka
ابتدا باید Kafka را نصب و راه‌اندازی کنید. می‌توانید از Docker برای ساده‌تر کردن این فرآیند استفاده کنید.

راه‌اندازی Kafka با Docker:
# 
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka

# راه‌اندازی Zookeeper
docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper

# راه‌اندازی Kafka
docker run -d --name kafka -p 9092:9092 --link zookeeper wurstmeister/kafka \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_BROKER_ID=1

❇️2. ایجاد موضوع (Topic) در Kafka
برای ایجاد موضوع در Kafka از ابزارهای CLI استفاده کنید.

docker exec kafka kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

❇️ 3. نصب کتابخانه‌های Kafka برای Go

می‌توانید از کتابخانه‌ی [sarama](https://github.com/Shopify/sarama) برای کار با Kafka در Go استفاده کنید.

go get github.com/Shopify/sarama

❇️4. نوشتن تولیدکننده (Producer) در Go
کد زیر یک تولیدکننده Kafka را در Go پیاده‌سازی می‌کند:

package main

import (
"log"
"os"

"github.com/Shopify/sarama"
)

func main() {
brokerList := []string{"localhost:9092"}
topic := "my-topic"

config := sarama.NewConfig()
config.Producer.Return.Successes = true

producer, err := sarama.NewSyncProducer(brokerList, config)
if err != nil {
log.Fatalln("Failed to start producer:", err)
}
defer producer.Close()

msg := &sarama.ProducerMessage{
Topic: topic,
Key: sarama.StringEncoder("key"),
Value: sarama.StringEncoder("value"),
}

partition, offset, err := producer.SendMessage(msg)
if err != nil {
log.Fatalln("Failed to send message:", err)
}

log.Printf("Message is stored in topic(%s)/partition(%d)/offset(%d)\n", topic, partition, offset)
}

❇️5. نوشتن مصرف‌کننده (Consumer) در Go
کد زیر یک مصرف‌کننده Kafka را در Go پیاده‌سازی می‌کند:

package main

import (
"log"

"github.com/Shopify/sarama"
)

func main() {
brokerList := []string{"localhost:9092"}
topic := "my-topic"
config := sarama.NewConfig()

master, err := sarama.NewConsumer(brokerList, config)
if err != nil {
log.Fatalln("Failed to start consumer:", err)
}
defer master.Close()

consumer, err := master.ConsumePartition(topic, 0, sarama.OffsetOldest)
if err != nil {
log.Fatalln("Failed to start partition consumer:", err)
}
defer consumer.Close()

for message := range consumer.Messages() {
log.Printf("Consumed message offset %d: %s\n", message.Offset, string(message.Value))
}
}



2. موضوع را در Kafka ایجاد کنید.
3. کد تولیدکننده را اجرا کنید تا پیام‌ها به Kafka ارسال شوند.
4. کد مصرف‌کننده را اجرا کنید تا پیام‌های دریافتی از Kafka را پردازش کند.

با این روش، می‌توانید دو سرویس Go را با استفاده از Kafka به هم متصل کنید. Kafka به عنوان یک پیام‌رسان با کارایی بالا، ارتباط غیرهمزمان بین سرویس‌ها را ممکن می‌سازد و از مدیریت بار کاری به خوبی پشتیبانی می‌کند.


👑 @gopher_academy | 💸 Donate | 💋 Boost
9👍3🔥3🍾2💯1

👑 @gopher_academy | 💸 Donate | 💋 Boost
💊8👍7💯41


📌 Backend Software Engineer Golang for Lounge (all genders)

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: zalando

📍 Location: GERMANY

🔗 Tags: #golang #git #kubernetes #aws #microservices



📌 BackEnd (Golang) Engineer

📝 Visa Sponsorship:

🌍 Relocation Package:

🏢 Company: moon active

📍 Location: POLAND

🔗 Tags: #python #golang #redis #rabbitmq #gcp #grpc #sqs #c #server #kubernetes #aws #docker #devops #cloud #scrum #sql


👑 @gopher_academy | 💸 Donate | 💋 Boost
👍43
✍️انتخاب بین Kafka و gRPC برای ارتباط بین سرویس‌ها به نیازها و الزامات خاص پروژه شما بستگی دارد. هر یک از این ابزارها دارای مزایا و معایب خاص خود هستند که در زیر به آن‌ها پرداخته شده است تا بتوانید تصمیم بهتری بگیرید:

💜Kafka
🔻مزایا:
🔹- غیرهمزمانی و تحمل‌پذیری بالا: Kafka به عنوان یک پیام‌رسان غیرهمزمان عمل می‌کند و می‌تواند حجم بالایی از داده‌ها را مدیریت کند.
🔹- مقیاس‌پذیری: Kafka برای مدیریت مقیاس‌پذیری بالا و پردازش داده‌های بزرگ طراحی شده است.
🔹- قابلیت ذخیره‌سازی پیام‌ها: Kafka پیام‌ها را برای مدت زمان مشخصی ذخیره می‌کند، بنابراین مصرف‌کنندگان می‌توانند پیام‌ها را با تأخیر پردازش کنند.
🔹- پشتیبانی از پردازش داده‌های جریانی: Kafka به خوبی با سیستم‌های پردازش داده‌های جریانی (Stream Processing) مانند Apache Flink و Apache Storm سازگار است.

🔻معایب:
🔹- پیچیدگی در تنظیم و نگهداری: راه‌اندازی و نگهداری Kafka ممکن است پیچیده‌تر از برخی ابزارهای دیگر باشد.
🔹- تأخیر: به دلیل ماهیت غیرهمزمانی، ممکن است تأخیر بیشتری نسبت به ارتباطات همزمان مانند gRPC داشته باشد.


💜gRPC
🔻مزایا:
🔹- کارایی بالا و تأخیر کم: gRPC از پروتکل HTTP/2 و فرمت باینری پروتوباف استفاده می‌کند که تأخیر را کاهش می‌دهد و کارایی را افزایش می‌دهد.
🔹- پشتیبانی از ارتباط دوجهته و استریمینگ: gRPC از استریمینگ دوجهته پشتیبانی می‌کند که برای برخی کاربردها بسیار مفید است.
🔹- پشتیبانی از چندین زبان: gRPC از بسیاری از زبان‌های برنامه‌نویسی پشتیبانی می‌کند و به راحتی می‌توان از آن در محیط‌های مختلف استفاده کرد.

🔻معایب:
🔹- عدم ذخیره‌سازی پیام‌ها: gRPC پیام‌ها را ذخیره نمی‌کند، بنابراین اگر مصرف‌کننده در دسترس نباشد، پیام‌ها از دست می‌روند.
🔹- عدم پشتیبانی از غیرهمزمانی به شکل بومی: gRPC به طور بومی برای ارتباطات همزمان طراحی شده است، بنابراین برای کاربردهای غیرهمزمان ممکن است مناسب نباشد.

🤝انتخاب بهترین روش
در نهایت، انتخاب بین Kafka و gRPC به نیازهای خاص پروژه شما بستگی دارد:

- اگر نیاز به پردازش داده‌های بزرگ، غیرهمزمانی، و تحمل‌پذیری بالا دارید، Kafka انتخاب بهتری است.
- اگر نیاز به ارتباط سریع و با تأخیر کم، و پشتیبانی از ارتباطات دوجهته دارید، gRPC مناسب‌تر است.

🤝 ترکیب Kafka و gRPC
در برخی پروژه‌ها، ترکیب Kafka و gRPC می‌تواند مزایای هر دو را به شما بدهد. برای مثال، می‌توانید از gRPC برای ارتباطات سریع و با تأخیر کم بین سرویس‌ها استفاده کنید و از Kafka برای پردازش داده‌های جریانی و مدیریت بار کاری بهره ببرید.

🔥🔥 مثال ترکیب Kafka و gRPC
فرض کنید شما یک سیستم سفارش‌دهی آنلاین دارید:
- از gRPC برای مدیریت درخواست‌های بلادرنگ (real-time) مانند ثبت سفارش و دریافت وضعیت سفارش استفاده می‌کنید.
- از Kafka برای پردازش‌های پس‌زمینه‌ای (background processing) مانند ارسال ایمیل‌های تأیید سفارش و به‌روزرسانی موجودی کالا استفاده می‌کنید.

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

👑 @gopher_academy | 💸 Donate | 💋 Boost
👍10🕊1🍾1💋1
🔴چندتا مقاله جالب که امروز توی golang weekly منتشر شده

🟢 اگر میخوای بهتر در مورد چنل ها توی گولنگ بدونی این مقاله خوبیه
🔵 https://www.dolthub.com/blog/2024-06-21-channel-three-ways/

🟢 یه مقاله جذاب که خودم به شخصه منو یاد دانشگاه انداخت مقاله زیر هست که میگه ساخت یک ریجیکس ار ابتدا در گو
🔵 https://lewismetcalf.com/series/making-regex-from-scratch-in-go/

🟢 راهنمای عملی برای به روز رسانی ماژول Go
🔵 https://carlosbecker.com/posts/pragmatic-gomod-bump/

🟢 اگر تست می نویسی مثل بعضی ها😅 این مقاله خوبیه
🔵 https://henvic.dev/posts/testing-go/

🟢 هفت اشتباه رایج در استفاده از اینترفیس ها
🔵 https://medium.com/@andreiboar/7-common-interface-mistakes-in-go-1d3f8e58be60

🟢 اگر از چت جی پی تی توی کدهات میخوای استفاده کنی این کتابخونه خوبیه
🔵 https://github.com/sashabaranov/go-openai

🟢 اگر دنبال یه کتابخونه برای استفاده از متغیر های محیطی توی کدت هستی اینم کتابخونه خوبیه البته خودم فعلن استفاده نکردم
🔵 https://github.com/caarlos0/env



#golang_weekly

👑 @gopher_academy | 💸 Donate | 💋 Boost
🔥52👍2
What mechanism does Go use to manage memory automatically?
Anonymous Quiz
85%
Garbage collection
10%
Reference counting
5%
External memory manager*
👍4