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. تعریف پروتکل ارتباطی:
- ابتدا فایل
- به عنوان مثال، فایل
❇️2. تولید کدهای gRPC:
- با استفاده از
- ابتدا پلاگین gRPC برای Go را نصب کنید:
- سپس دستور زیر را برای تولید کدهای Go اجرا کنید:
❇️3. پیادهسازی سرور:
- کدی که سرور gRPC را پیادهسازی میکند. به عنوان مثال، در Go:
❇️4. پیادهسازی کلاینت:
- کدی که کلاینت gRPC را پیادهسازی میکند. به عنوان مثال، در Go:
❇️5. راهاندازی و تست:
- ابتدا سرور را راهاندازی کنید و سپس کلاینت را اجرا کنید تا ارتباط بین دو سرویس برقرار شود و دادهها ارسال و دریافت شوند.
با این مراحل، شما میتوانید دو سرویس را با استفاده از gRPC در زبان Go به هم متصل کنید و ارتباط سریع و کارآمدی بین آنها برقرار کنید.
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
در زبان برنامهنویسی 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💋4❤2🔥1🎉1
✍️برای ارتباط بین دو سرویس Go با استفاده از Kafka
باید چند مرحله را طی کنید. این مراحل شامل نصب و تنظیم Kafka، ایجاد موضوعات (topics) در Kafka، نوشتن تولیدکننده (producer) و مصرفکننده (consumer) در Go، و اجرای سرویسها است. در زیر یک راهنمای کامل برای این فرآیند آورده شده است:
❇️ 1. نصب و راهاندازی Kafka
ابتدا باید Kafka را نصب و راهاندازی کنید. میتوانید از Docker برای سادهتر کردن این فرآیند استفاده کنید.
راهاندازی Kafka با Docker:
❇️2. ایجاد موضوع (Topic) در Kafka
برای ایجاد موضوع در Kafka از ابزارهای CLI استفاده کنید.
❇️ 3. نصب کتابخانههای Kafka برای Go
میتوانید از کتابخانهی [sarama](https://github.com/Shopify/sarama) برای کار با Kafka در Go استفاده کنید.
❇️4. نوشتن تولیدکننده (Producer) در Go
کد زیر یک تولیدکننده Kafka را در Go پیادهسازی میکند:
❇️5. نوشتن مصرفکننده (Consumer) در Go
کد زیر یک مصرفکننده Kafka را در Go پیادهسازی میکند:
2. موضوع را در Kafka ایجاد کنید.
3. کد تولیدکننده را اجرا کنید تا پیامها به Kafka ارسال شوند.
4. کد مصرفکننده را اجرا کنید تا پیامهای دریافتی از Kafka را پردازش کند.
با این روش، میتوانید دو سرویس Go را با استفاده از Kafka به هم متصل کنید. Kafka به عنوان یک پیامرسان با کارایی بالا، ارتباط غیرهمزمان بین سرویسها را ممکن میسازد و از مدیریت بار کاری به خوبی پشتیبانی میکند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
باید چند مرحله را طی کنید. این مراحل شامل نصب و تنظیم 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
What problem is the 'context' package in Go designed to solve?
Anonymous Quiz
5%
Managing memory allocation
8%
Handling efficient concurrency
87%
Carrying deadlines, cancellation signals, and request-scoped values API boundaries and goroutines
❤3
➖➖➖➖➖➖➖➖
📌 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
📌 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
👍4❤3
✍️انتخاب بین 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
💜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
🟢 اگر میخوای بهتر در مورد چنل ها توی گولنگ بدونی این مقاله خوبیه
🔵 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
🔥5❤2👍2
What mechanism does Go use to manage memory automatically?
Anonymous Quiz
85%
Garbage collection
10%
Reference counting
5%
External memory manager*
👍4
📌 BackEnd (Golang) Engineer
📝 Visa Sponsorship: ✅
🌍 Relocation Package: ✅
🏢 Company: moon active
📍 Location: POLAND
⌨️ Category: #Programming
🔗 Tags: #python #golang #redis #rabbitmq #gcp #grpc #sqs #c #server #kubernetes #aws #docker #devops #cloud #scrum #sql
➖➖➖➖➖➖➖➖
📌 Staff Backend Engineer
📝 Visa Sponsorship: ✅
🌍 Relocation Package: ✅
🏢 Company: plexus resource solutions
📍 Location: CANADA
⌨️ Category: #Programming
🔗 Tags: #golang #microservices #cloud #blockchain
➖➖➖➖➖➖➖➖
📌 Backend Engineer
📝 Visa Sponsorship: ✅
🌍 Relocation Package: ❌
🏢 Company: sword health
📍 Location: PORTUGAL
⌨️ Category: #Programming
🔗 Tags: #nosql #golang #redis #c #responsive #sql
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
📝 Visa Sponsorship: ✅
🌍 Relocation Package: ✅
🏢 Company: moon active
📍 Location: POLAND
⌨️ Category: #Programming
🔗 Tags: #python #golang #redis #rabbitmq #gcp #grpc #sqs #c #server #kubernetes #aws #docker #devops #cloud #scrum #sql
➖➖➖➖➖➖➖➖
📌 Staff Backend Engineer
📝 Visa Sponsorship: ✅
🌍 Relocation Package: ✅
🏢 Company: plexus resource solutions
📍 Location: CANADA
⌨️ Category: #Programming
🔗 Tags: #golang #microservices #cloud #blockchain
➖➖➖➖➖➖➖➖
📌 Backend Engineer
📝 Visa Sponsorship: ✅
🌍 Relocation Package: ❌
🏢 Company: sword health
📍 Location: PORTUGAL
⌨️ Category: #Programming
🔗 Tags: #nosql #golang #redis #c #responsive #sql
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
❤1
✍️فرق kafka و rabbitmq
🔵معماری
🟢Kafka:
🔻مدل انتشار-اشتراک: Kafka بر اساس مدل انتشار-اشتراک (publish-subscribe) کار میکند. تولیدکنندگان پیامها را به مباحث (topics) میفرستند و مصرفکنندگان پیامها را از این مباحث میخوانند.
🔻ذخیرهسازی پایدار: Kafka پیامها را به صورت پایدار در دیسک ذخیره میکند و به مصرفکنندگان اجازه میدهد که پیامها را بر اساس آفست (offset) خاصی دوباره بخوانند.
🔻مقیاسپذیری: Kafka به راحتی مقیاسپذیر است و میتواند به صورت افقی با افزودن نودهای بیشتر در کلاستر (cluster) خود گسترش یابد.
🔻کارایی بالا: Kafka برای پردازش حجم زیادی از دادهها با تاخیر کم و توان عملیاتی بالا طراحی شده است.
🟢RabbitMQ:
🔻مدل صف-پیام: RabbitMQ بر اساس مدل صف-پیام (message queue) کار میکند. پیامها در صفها قرار میگیرند و مصرفکنندگان پیامها را از صفها میخوانند.
🔻قابلیتهای مسیریابی پیشرفته: RabbitMQ از انواع مختلف مبادلات (exchanges) مانند مستقیم، موضوعی و هدرها برای مسیریابی پیامها استفاده میکند.
🔻پشتیبانی از پروتکلهای مختلف: RabbitMQ از پروتکلهای مختلف پیامرسانی مانند AMQP، MQTT و STOMP پشتیبانی میکند.
🔻سادگی: RabbitMQ به راحتی قابل نصب و پیکربندی است و برای موارد استفاده سادهتر بسیار مناسب است.
🔵موارد استفاده
🟢Kafka:
🔻پردازش دادههای جریانی: Kafka برای پردازش دادههای جریانی و تجزیه و تحلیل دادههای بزرگ در زمان واقعی بسیار مناسب است.
🔻سیستمهای ثبت تراکنش (log): Kafka به عنوان یک سیستم ثبت تراکنش توزیع شده برای نگهداری و پردازش لاگهای بزرگ استفاده میشود.
🔻میکروسرویسها: Kafka به عنوان یک سیستم پیامرسانی توزیع شده برای ارتباط بین میکروسرویسها استفاده میشود.
🟢RabbitMQ:
🔻میکروسرویسها: RabbitMQ نیز برای ارتباط بین میکروسرویسها مناسب است، به ویژه در مواردی که نیاز به مسیریابی پیشرفته پیامها وجود دارد.
🔻مدیریت وظایف: RabbitMQ برای مدیریت و پردازش وظایف پسزمینه مناسب است.
🔻سیستمهای صف: RabbitMQ برای مواردی که نیاز به صفهای ساده برای پیامرسانی و مدیریت بار کاری وجود دارد، مناسب است.
🔵کارایی و مقیاسپذیری
🟢Kafka:
🔻توان عملیاتی بالا: Kafka برای پردازش حجم زیادی از دادهها با توان عملیاتی بالا و تاخیر کم طراحی شده است.
🔻مقیاسپذیری افقی: Kafka به راحتی با افزودن نودهای بیشتر به کلاستر خود مقیاسپذیر است.
🟢RabbitMQ:
🔻کارایی متوسط: RabbitMQ نیز کارایی بالایی دارد، اما در مقایسه با Kafka ممکن است برای حجم بسیار زیاد دادهها کارایی کمتری داشته باشد.
🔻مقیاسپذیری: RabbitMQ به صورت افقی مقیاسپذیر است، اما ممکن است برای مقیاسبندی به اندازه Kafka بهینه نباشد.
🥂جمعبندی
🟢Kafka:
🔻مناسب برای پردازش دادههای جریانی، سیستمهای ثبت تراکنش و ارتباط بین میکروسرویسها با حجم بالای دادهها.
🔻توان عملیاتی بالا و مقیاسپذیری افقی عالی.
🟢RabbitMQ:
🔻مناسب برای مدیریت وظایف، مسیریابی پیشرفته پیامها و سیستمهای صف با نیاز به پشتیبانی از پروتکلهای مختلف.
🔻سادگی در نصب و پیکربندی و قابلیتهای مسیریابی پیشرفته.
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
🔵معماری
🟢Kafka:
🔻مدل انتشار-اشتراک: Kafka بر اساس مدل انتشار-اشتراک (publish-subscribe) کار میکند. تولیدکنندگان پیامها را به مباحث (topics) میفرستند و مصرفکنندگان پیامها را از این مباحث میخوانند.
🔻ذخیرهسازی پایدار: Kafka پیامها را به صورت پایدار در دیسک ذخیره میکند و به مصرفکنندگان اجازه میدهد که پیامها را بر اساس آفست (offset) خاصی دوباره بخوانند.
🔻مقیاسپذیری: Kafka به راحتی مقیاسپذیر است و میتواند به صورت افقی با افزودن نودهای بیشتر در کلاستر (cluster) خود گسترش یابد.
🔻کارایی بالا: Kafka برای پردازش حجم زیادی از دادهها با تاخیر کم و توان عملیاتی بالا طراحی شده است.
🟢RabbitMQ:
🔻مدل صف-پیام: RabbitMQ بر اساس مدل صف-پیام (message queue) کار میکند. پیامها در صفها قرار میگیرند و مصرفکنندگان پیامها را از صفها میخوانند.
🔻قابلیتهای مسیریابی پیشرفته: RabbitMQ از انواع مختلف مبادلات (exchanges) مانند مستقیم، موضوعی و هدرها برای مسیریابی پیامها استفاده میکند.
🔻پشتیبانی از پروتکلهای مختلف: RabbitMQ از پروتکلهای مختلف پیامرسانی مانند AMQP، MQTT و STOMP پشتیبانی میکند.
🔻سادگی: RabbitMQ به راحتی قابل نصب و پیکربندی است و برای موارد استفاده سادهتر بسیار مناسب است.
🔵موارد استفاده
🟢Kafka:
🔻پردازش دادههای جریانی: Kafka برای پردازش دادههای جریانی و تجزیه و تحلیل دادههای بزرگ در زمان واقعی بسیار مناسب است.
🔻سیستمهای ثبت تراکنش (log): Kafka به عنوان یک سیستم ثبت تراکنش توزیع شده برای نگهداری و پردازش لاگهای بزرگ استفاده میشود.
🔻میکروسرویسها: Kafka به عنوان یک سیستم پیامرسانی توزیع شده برای ارتباط بین میکروسرویسها استفاده میشود.
🟢RabbitMQ:
🔻میکروسرویسها: RabbitMQ نیز برای ارتباط بین میکروسرویسها مناسب است، به ویژه در مواردی که نیاز به مسیریابی پیشرفته پیامها وجود دارد.
🔻مدیریت وظایف: RabbitMQ برای مدیریت و پردازش وظایف پسزمینه مناسب است.
🔻سیستمهای صف: RabbitMQ برای مواردی که نیاز به صفهای ساده برای پیامرسانی و مدیریت بار کاری وجود دارد، مناسب است.
🔵کارایی و مقیاسپذیری
🟢Kafka:
🔻توان عملیاتی بالا: Kafka برای پردازش حجم زیادی از دادهها با توان عملیاتی بالا و تاخیر کم طراحی شده است.
🔻مقیاسپذیری افقی: Kafka به راحتی با افزودن نودهای بیشتر به کلاستر خود مقیاسپذیر است.
🟢RabbitMQ:
🔻کارایی متوسط: RabbitMQ نیز کارایی بالایی دارد، اما در مقایسه با Kafka ممکن است برای حجم بسیار زیاد دادهها کارایی کمتری داشته باشد.
🔻مقیاسپذیری: RabbitMQ به صورت افقی مقیاسپذیر است، اما ممکن است برای مقیاسبندی به اندازه Kafka بهینه نباشد.
🥂جمعبندی
🟢Kafka:
🔻مناسب برای پردازش دادههای جریانی، سیستمهای ثبت تراکنش و ارتباط بین میکروسرویسها با حجم بالای دادهها.
🔻توان عملیاتی بالا و مقیاسپذیری افقی عالی.
🟢RabbitMQ:
🔻مناسب برای مدیریت وظایف، مسیریابی پیشرفته پیامها و سیستمهای صف با نیاز به پشتیبانی از پروتکلهای مختلف.
🔻سادگی در نصب و پیکربندی و قابلیتهای مسیریابی پیشرفته.
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
❤5👍1🍾1🎃1
✍️در زبان برنامهنویسی Go و به ویژه در کتابخانه
🟢
در Go،
🔵 ویژگیها:
1. عدم اشاره به هیچ چیز:
2. پیشفرض برای اشارهگرها و رابطها: بسیاری از انواع دادهها میتوانند مقدار
🟢
🔵 ویژگیها:
1. بدنه خالی بهینه شده:
2. پیادهسازی `io.ReadCloser`:
🔵 مزایا:
1. کاهش استفاده از منابع: به دلیل پیادهسازی خاص، استفاده از
2. سازگاری با رابطها: چون
🔵 مقایسه در زمینه HTTP
هنگام کار با درخواستها (requests) و پاسخها (responses) در
🔵 مثال: ایجاد یک درخواست HTTP با بدنه خالی
استفاده از
در اینجا، بدنه درخواست به صورت
🔵استفاده از
در اینجا، بدنه درخواست به طور صریح به عنوان
🍾 جمعبندی
- `nil`:
- نشاندهنده عدم وجود بدنه یا مقدار.
- مقدار پیشفرض برای انواع اشارهگرها و رابطها.
- میتواند برای بدنههای خالی استفاده شود، اما از لحاظ عملکردی بهینه نیست.
- `http.NoBody`:
- نشاندهنده یک بدنه خالی بهینه شده برای درخواستها و پاسخها.
- پیادهسازی
- بهینهتر برای مواردی که بدنه خالی نیاز است، به ویژه در زمینه HTTP.
به طور کلی، استفاده از
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
net/http`، دو مقدار `nil
و http.NoBody
تفاوتهای مهمی دارند که باید به آنها توجه کنید. این تفاوتها به ویژه در زمینه استفاده از درخواستها (requests) و پاسخها (responses) اهمیت پیدا میکنند.🟢
nil
در Go،
nil
میتواند به عنوان مقدار پیشفرض برای انواع اشارهگرها، رابطها (interfaces)، نقشهها (maps)، اسلایسها (slices)، کانالها (channels) و توابع استفاده شود. وقتی که یک متغیر از نوع اشارهگر یا رابط مقدار nil
دارد، به این معنی است که به هیچ چیز اشاره نمیکند یا مقداردهی نشده است.🔵 ویژگیها:
1. عدم اشاره به هیچ چیز:
nil
به این معنی است که هیچ مقدار یا آدرسی وجود ندارد.2. پیشفرض برای اشارهگرها و رابطها: بسیاری از انواع دادهها میتوانند مقدار
nil
داشته باشند، از جمله *http.Request.Body
.🟢
http.NoBody
اhttp.NoBody
یک مقدار خاص در بسته net/http
است که به طور خاص به عنوان یک جایگزین برای بدنهی (body) خالی در درخواستها و پاسخها استفاده میشود. این مقدار به طور خاص برای بهینهسازی و جلوگیری از استفاده از منابع غیرضروری طراحی شده است.🔵 ویژگیها:
1. بدنه خالی بهینه شده:
http.NoBody
به جای استفاده از یک اشارهگر nil
برای بدنه خالی، به عنوان یک جایگزین بهینه شده استفاده میشود.2. پیادهسازی `io.ReadCloser`:
http.NoBody
یک نوع خاص است که io.ReadCloser
را پیادهسازی میکند و همیشه خواندن صفر بایت را برمیگرداند و بستن بدون خطا.🔵 مزایا:
1. کاهش استفاده از منابع: به دلیل پیادهسازی خاص، استفاده از
http.NoBody
میتواند منجر به کاهش استفاده از منابع و بهینهسازی عملکرد شود.2. سازگاری با رابطها: چون
http.NoBody
رابط io.ReadCloser
را پیادهسازی میکند، میتوان آن را در جاهایی که انتظار io.ReadCloser
میرود، به کار برد.🔵 مقایسه در زمینه HTTP
هنگام کار با درخواستها (requests) و پاسخها (responses) در
net/http`، تفاوت بین استفاده از `nil
و http.NoBody
مهم است.🔵 مثال: ایجاد یک درخواست HTTP با بدنه خالی
استفاده از
nil
:req, err := http.NewRequest("GET", "http://example.com", nil)
if err != nil {
// handle error
}
در اینجا، بدنه درخواست به صورت
nil
تعیین میشود که به معنای عدم وجود بدنه است.🔵استفاده از
http.NoBody
:req, err := http.NewRequest("GET", "http://example.com", http.NoBody)
if err != nil {
// handle error
}
در اینجا، بدنه درخواست به طور صریح به عنوان
http.NoBody
تنظیم میشود که نشاندهنده یک بدنه خالی بهینه شده است.🍾 جمعبندی
- `nil`:
- نشاندهنده عدم وجود بدنه یا مقدار.
- مقدار پیشفرض برای انواع اشارهگرها و رابطها.
- میتواند برای بدنههای خالی استفاده شود، اما از لحاظ عملکردی بهینه نیست.
- `http.NoBody`:
- نشاندهنده یک بدنه خالی بهینه شده برای درخواستها و پاسخها.
- پیادهسازی
io.ReadCloser
.- بهینهتر برای مواردی که بدنه خالی نیاز است، به ویژه در زمینه HTTP.
به طور کلی، استفاده از
http.NoBody
به جای nil
در مواردی که بدنه خالی در HTTP نیاز است، میتواند به بهبود عملکرد و کاهش استفاده از منابع کمک کند.➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
👍12❤3🔥1🍾1💅1
Massimo DevMassimo Dev
#برنامه_نویس سنیور کیه واقعا؟
فقط یک جمله:
کسی که برای پیچیدهترین صورت مسألهها، سادهترین راه حلها رو ارائه میده.
اگر حس می کنید کدنویسی پیچیده یعنی سنیوریتی، باخت دادید تا الان.
مشتی باشید!
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
#برنامه_نویس سنیور کیه واقعا؟
فقط یک جمله:
کسی که برای پیچیدهترین صورت مسألهها، سادهترین راه حلها رو ارائه میده.
اگر حس می کنید کدنویسی پیچیده یعنی سنیوریتی، باخت دادید تا الان.
مشتی باشید!
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
🔥18👍9🍾2💋1
برای رسیدن به متریک مناسب سرویس تون یه سری راه حل اینجا گذاشته
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
👍5❤2🕊1
📌 Go Developers (m/f/d) create masterpieces & pioneering work in the backend while their career takes off at the front!
📝 Type: Visa Sponsorship
🌍 Relocation Package: ✅
🏢 Company: mytalentscout gmbh
📍 Location: GERMANY
⌨️ Category: #Programming
🔗 Tags: #golang #mysql #ai
📌 Backend Engineer (Tabby Finance)
📝 Type: Visa Sponsorship
🌍 Relocation Package: ✅
🏢 Company: tabby
📍 Location: SERBIA
⌨️ Category: #Programming
🔗 Tags: #golang #postgresql #redis #kubernetes #cloud #gitlab
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
📝 Type: Visa Sponsorship
🌍 Relocation Package: ✅
🏢 Company: mytalentscout gmbh
📍 Location: GERMANY
⌨️ Category: #Programming
🔗 Tags: #golang #mysql #ai
📌 Backend Engineer (Tabby Finance)
📝 Type: Visa Sponsorship
🌍 Relocation Package: ✅
🏢 Company: tabby
📍 Location: SERBIA
⌨️ Category: #Programming
🔗 Tags: #golang #postgresql #redis #kubernetes #cloud #gitlab
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
Jaabz
Go Developers (m/f/d) create masterpieces & pioneering work in the backend while their career takes off at the front! - mytalentscout…
Would you rather code the Go backend in a large IT hub with structure, resources, and experience, or be part of a cool startup among passionate tech enthusiasts...
🕊3👍1🔥1🎃1
Which of the following is true about Go's deadlock detection?
Anonymous Quiz
10%
Go detects deadlocks only in the main function
90%
The Go runtime can detect deadlocks and panic if it occurs
🏆4🔥1🕊1
Why is it important to close channels in Go?
Anonymous Quiz
54%
To prevent memory leaks and indicate completion
17%
To improve performance of the garbage collector
13%
To automatically free all variables used by the channel
16%
To increase the efficiency of the Go runtime scheduler
🕊2💋2💅2
لیستی از مکانیزم های قفل برای جلوگیری از دسترسی همزمان دادها و ناسازگاری داده ها
👇👇👇👇
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
👇👇👇👇
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
👍5
🔻لیستی از مکانیزم های قفل برای جلوگیری از دسترسی همزمان دادها و ناسازگاری داده ها🔻
🎯1. Shared Lock (S Lock)
It allows multiple transactions to read a resource simultaneously but not modify it. Other transactions can also acquire a shared lock on the same resource.
🎯2. Exclusive Lock (X Lock)
It allows a transaction to both read and modify a resource. No other transaction can acquire any type of lock on the same resource while an exclusive lock is held.
🎯3. Update Lock (U Lock)
It is used to prevent a deadlock scenario when a transaction intends to update a resource.
🎯4. Schema Lock
It is used to protect the structure of database objects.
🎯5. Bulk Update Lock (BU Lock)
It is used during bulk insert operations to improve performance by reducing the number of locks required.
🎯6. Key-Range Lock
It is used in indexed data to prevent phantom reads (inserting new rows into a range that a transaction has already read).
🎯7. Row-Level Lock
It locks a specific row in a table, allowing other rows to be accessed concurrently.
🎯8. Page-Level Lock
It locks a specific page (a fixed-size block of data) in the database.
🎯9. Table-Level Lock
It locks an entire table. This is simple to implement but can reduce concurrency significantly.
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
🎯1. Shared Lock (S Lock)
It allows multiple transactions to read a resource simultaneously but not modify it. Other transactions can also acquire a shared lock on the same resource.
🎯2. Exclusive Lock (X Lock)
It allows a transaction to both read and modify a resource. No other transaction can acquire any type of lock on the same resource while an exclusive lock is held.
🎯3. Update Lock (U Lock)
It is used to prevent a deadlock scenario when a transaction intends to update a resource.
🎯4. Schema Lock
It is used to protect the structure of database objects.
🎯5. Bulk Update Lock (BU Lock)
It is used during bulk insert operations to improve performance by reducing the number of locks required.
🎯6. Key-Range Lock
It is used in indexed data to prevent phantom reads (inserting new rows into a range that a transaction has already read).
🎯7. Row-Level Lock
It locks a specific row in a table, allowing other rows to be accessed concurrently.
🎯8. Page-Level Lock
It locks a specific page (a fixed-size block of data) in the database.
🎯9. Table-Level Lock
It locks an entire table. This is simple to implement but can reduce concurrency significantly.
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
👍4❤1
Massimo Dev
میدونستید #ایندکس ترکیبی یا Composite Index تو #دیتابیس چی هست؟ یه سوالیه که معمولا تو #مصاحبه های #استخدام #برنامه_نویسی میپرسن!
ایندکس ترکیبی، ایندکسی هست که چندتا ستون رو باهم تو خودش داره. یعنی به جای اینکه فقط یه ستون رو ایندکس کنیم، میایم و چندتا ستون رو با همدیگه ایندکس میکنیم تا وقتی که توی کوئریها (دستورات جستجو) از چندتا ستون استفاده میکنیم، دیتابیس سریعتر بتونه نتایج رو پیدا کنه.
👈 مثال از ایندکس ترکیبی
فرض کن یه جدول به اسم
-
-
-
-
-
اگه بخوایم جستجوهایی که بر اساس
👈 ترتیب ستونها توی ایندکس ترکیبی:
ترتیب ستونها توی ایندکس ترکیبی خیلی مهمه. این ایندکس بیشتر به درد جستجوهایی میخوره که از ستونهای اول ایندکس شروع بشن.
🍒 مثالهایی از کوئریها
1. کوئریای که از هر دو ستون استفاده میکنه**:
این کوئری میتونه از ایندکس ترکیبی
2. کوئریای که فقط از ستون اول استفاده میکنه:
این کوئری هم میتونه از ایندکس استفاده کنه چون با ستون
3. کوئریای که فقط از ستون دوم استفاده میکنه:
این کوئری نمیتونه به طور مؤثری از ایندکس ترکیبی idx_department_hire_date استفاده کنه، چون با ستون department شروع نمیشه. به این معنا نیست که تحت هیچ شرایطی از ایندکس استفاده نمیکنه، بلکه به این معناست که از بخش زیادی از ایندکس استفاده نمیشه و عملاً سود چندانی از ایندکس نمیبره.
4. کوئریای که از هر دو ستون ولی به ترتیب برعکس استفاده میکنه:
این کوئری هم میتونه از ایندکس استفاده کنه چون از هر دو ستون استفاده کرده، ولی بهتره ستونها رو به همون ترتیبی که تو ایندکس تعریف شدن استفاده کنیم.
👈👈👈 خلاصه
🔺 ترتیب مهمه: ترتیب ستونها توی ایندکس ترکیبی خیلی مهمه. ایندکس وقتی بهترین کارایی رو داره که جستجوها از ستونهای اول ایندکس شروع بشن.
🔺 استفاده از پیشوند: جستجوهایی که از ستون اول، دو ستون اول و همینطور ادامه دارن، از ایندکس بهره میبرن.
🔺 استفاده جزئی: استفاده از ستون دوم یا بعدی بدون ستون اول نمیتونه از ایندکس ترکیبی استفاده کنه.
فهمیدن اینکه کوئریهات چجوری با ایندکسها کار میکنن خیلی مهمه تا بتونی عملکرد دیتابیس رو بهتر کنی.
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
میدونستید #ایندکس ترکیبی یا Composite Index تو #دیتابیس چی هست؟ یه سوالیه که معمولا تو #مصاحبه های #استخدام #برنامه_نویسی میپرسن!
ایندکس ترکیبی، ایندکسی هست که چندتا ستون رو باهم تو خودش داره. یعنی به جای اینکه فقط یه ستون رو ایندکس کنیم، میایم و چندتا ستون رو با همدیگه ایندکس میکنیم تا وقتی که توی کوئریها (دستورات جستجو) از چندتا ستون استفاده میکنیم، دیتابیس سریعتر بتونه نتایج رو پیدا کنه.
👈 مثال از ایندکس ترکیبی
فرض کن یه جدول به اسم
employees
داریم که این ستونها رو داره:-
employee_id
-
first_name
-
last_name
-
department
-
hire_date
اگه بخوایم جستجوهایی که بر اساس
department
و hire_date
هستن سریعتر بشن، میایم و یه ایندکس ترکیبی روی این دوتا ستون درست میکنیم:CREATE INDEX idx_department_hire_date ON employees(department, hire_date);
👈 ترتیب ستونها توی ایندکس ترکیبی:
ترتیب ستونها توی ایندکس ترکیبی خیلی مهمه. این ایندکس بیشتر به درد جستجوهایی میخوره که از ستونهای اول ایندکس شروع بشن.
🍒 مثالهایی از کوئریها
1. کوئریای که از هر دو ستون استفاده میکنه**:
SELECT * FROM employees WHERE department = 'Sales' AND hire_date = '2023-01-15';
این کوئری میتونه از ایندکس ترکیبی
idx_department_hire_date
کامل استفاده کنه.2. کوئریای که فقط از ستون اول استفاده میکنه:
SELECT * FROM employees WHERE department = 'Sales';
این کوئری هم میتونه از ایندکس استفاده کنه چون با ستون
department
شروع شده.3. کوئریای که فقط از ستون دوم استفاده میکنه:
SELECT * FROM employees WHERE hire_date = '2023-01-15';
این کوئری نمیتونه به طور مؤثری از ایندکس ترکیبی idx_department_hire_date استفاده کنه، چون با ستون department شروع نمیشه. به این معنا نیست که تحت هیچ شرایطی از ایندکس استفاده نمیکنه، بلکه به این معناست که از بخش زیادی از ایندکس استفاده نمیشه و عملاً سود چندانی از ایندکس نمیبره.
4. کوئریای که از هر دو ستون ولی به ترتیب برعکس استفاده میکنه:
SELECT * FROM employees WHERE hire_date = '2023-01-15' AND department = 'Sales';
این کوئری هم میتونه از ایندکس استفاده کنه چون از هر دو ستون استفاده کرده، ولی بهتره ستونها رو به همون ترتیبی که تو ایندکس تعریف شدن استفاده کنیم.
👈👈👈 خلاصه
🔺 ترتیب مهمه: ترتیب ستونها توی ایندکس ترکیبی خیلی مهمه. ایندکس وقتی بهترین کارایی رو داره که جستجوها از ستونهای اول ایندکس شروع بشن.
🔺 استفاده از پیشوند: جستجوهایی که از ستون اول، دو ستون اول و همینطور ادامه دارن، از ایندکس بهره میبرن.
🔺 استفاده جزئی: استفاده از ستون دوم یا بعدی بدون ستون اول نمیتونه از ایندکس ترکیبی استفاده کنه.
فهمیدن اینکه کوئریهات چجوری با ایندکسها کار میکنن خیلی مهمه تا بتونی عملکرد دیتابیس رو بهتر کنی.
➖➖➖➖➖➖➖➖
👑 @gopher_academy | 💸 Donate | 💋 Boost
👍7💯4🔥1🎉1🕊1💋1