এন্টারপ্রাইজ অ্যাপ্লিকেশনে হাই-থ্রুপুট এসএমএস সার্ভিস
ব্যাংকিং, ফিনটেক ও বড় স্কেলের ই-কমার্স সিস্টেমে প্রতি মিনিটে হাজার হাজার নোটিফিকেশন প্রসেস করতে ব্যাকএন্ডে Golang (Go) কিংবা Java Spring Boot বহুল ব্যবহৃত হয়। এ ধরনের সিস্টেমে নোটিফিকেশন সার্ভিসকে অবশ্যই নন-ব্লকিং, কনকারেন্ট এবং অত্যন্ত দ্রুতগতির হতে হয়।
১. Golang (Go) দিয়ে হাই-স্পিড এসএমএস সেন্ডার ইমপ্লিমেন্টেশন
Go-এর গোরুটিন (Goroutines) ও চ্যানেল ব্যবহার করে প্রতি সেকেন্ডে শত শত এসএমএস সহজে কিউ করে পাঠানো যায়:
package main
import (
"fmt"
"io"
"net/http"
"net/url"
"time"
)
type SmsClient struct {
ApiKey string
SenderId string
Client *http.Client
}
func NewSmsClient(apiKey, senderId string) *SmsClient {
return &SmsClient{
ApiKey: apiKey,
SenderId: senderId,
Client: &http.Client{
Timeout: 10 * time.Second,
},
}
}
func (s *SmsClient) SendSMS(phone, message string) (string, error) {
endpoint := "https://smsbd.asia/api/send-sms.php"
data := url.Values{}
data.Set("api_key", s.ApiKey)
data.Set("sender_id", s.SenderId)
data.Set("phone", phone)
data.Set("message", message)
resp, err := s.Client.PostForm(endpoint, data)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(body), nil
}
func main() {
client := NewSmsClient("YOUR_SMSBD_API_KEY", "YOUR_SENDER_ID")
resp, err := client.SendSMS("01712345678", "Hello from Go Backend via SMSBD.Asia!")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("SMSBD Response:", resp)
}
২. Spring Boot (Java) এ WebClient বা RestTemplate দিয়ে ইন্টিগ্রেশন
স্প্রিং বুট অ্যাপ্লিকেশনে ডিপেন্ডেন্সি ইনজেকশনের মাধ্যমে একটি ডেডিকেটেড SmsService তৈরি করা যায়:
package com.example.service;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
@Service
public class SmsService {
@Value("${smsbd.api.key}")
private String apiKey;
@Value("${smsbd.sender.id}")
private String senderId;
private final RestTemplate restTemplate = new RestTemplate();
private final String API_URL = "https://smsbd.asia/api/send-sms.php";
public boolean sendSms(String phone, String message) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("api_key", apiKey);
map.add("sender_id", senderId);
map.add("phone", phone);
map.add("message", message);
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity(API_URL, request, String.class);
return response.getStatusCode() == HttpStatus.OK && response.getBody() != null && response.getBody().contains("success");
}
}
প্রোডাকশন অপ্টিমাইজেশন টিপস:
- কানেকশন পুলিং: এইচটিটিপি ক্লায়েন্টে Keep-Alive কানেকশন রিইউজ করুন যাতে প্রতিটি এসএমএসে নতুন করে TCP হ্যান্ডশেক করতে না হয়।
- নন-ব্লকিং কিউ: এসএমএস প্রেরণের কাজ মূল রিকোয়েস্ট থ্রেড থেকে আলাদা করে RabbitMQ, Kafka বা ইন-মেমরি চ্যানেলে দিন।
- অটোমেটিক রিট্রাই: নেটওয়ার্ক গ্লিচ হলে এক্সপোনেনশিয়াল ব্যাকঅফ সহ ৩ বার পর্যন্ত রিট্রাই লজিক রাখুন।