Thiết kế 1 hệ thống gửi mail sao cho hiệu quả ? - vozForums
vozForums
Go Back   vozForums > Học tập và công việc > Ngành CNTT > Phát triển Phần mềm
Reply
 
Thread Tools
  #1  
Old 28-09-2015, 12:01
catchimthangnaobantao catchimthangnaobantao is offline
K.I.A
 
Join Date: 01-2013
Posts: 306

Thiết kế 1 hệ thống gửi mail sao cho hiệu quả ?


Tiêu đề có thể hơi chuối, có gì các bác bỏ qua.

Mình thì chỉ dùng Windows nên phần bên dưới chỉ đến cập đến môi trường windows.

Như các bác biết thì tính năng gửi mail đôi khi là yêu cầu bắt buộc của hệ thống. Có nhiêu trường hợp cho việc gửi mail, mình xin ví dụ trường hợp đăng ký user.

Thông thường khi user đăng ký 1 tài khoản thành công thì mình sẽ send 1 cái email để active user đó lên (mặc định user là inactive).

Thông thường thì code của nút submit Register như sau:

if(Register()) // trả về true tức là đăng ký thành công
{
// send mail to active user
}
// làm gì đó tiếp theo, thông báo kết quả

Cách làm này không hay lắm vì hàm send mail có thể chạy lâu nên response time lớn -> user phải chờ lâu. 1 cải tiến hơn là cái phần send mail thì bỏ vào 1 thread khác để chạy hoặc dùng tính năng async/await trong .Net

1 cách implement khác nữa là xây dựng hẳn 1 service send mail riêng (vd: 1 windows service làm chức năng send mail). Khi user đăng ký thành công thì sẽ lưu vào table User ( có 1 cột tên là IsSentMailActive (bit) để tracking đã gửi mail active hay chưa. Trong phần windows service sẽ đước thiết lập cứ 1 phút 1 lần sẽ select trong bảng User ra các email của user inactive và tiến hành gửi mail. Email nào gửi xong rồi thì cập nhật giá trị IsSentMailActive = 1 (mặc định giá trị này là 0 ) (dĩ nhiên gửi mail active rồi thì không gửi nữa). Cách dùng windows servie thì nó tách biệt với hệ thống, user không phải chờ trang web respond time quá lâu, ngoài ra thì ta có thể gom hết các tính năng gửi mail vào 1 chỗ. Tuy nhiên nó cũng có nhược điểm đó là phần gửi mail có thể không diễn ra tức thời khi user đăng ký thành công, kết nối tới database hơi nhiều ( 1 phút kết nối tới database 1 lần). Nếu website có ít người đăng ký thì cách này không ổn lắm).

Các bác còn cách implement nào có thể chia sẽ cũng như đưa ra nhận xét về cách làm trên.

Thanks các bác đã xem

Last edited by catchimthangnaobantao; 28-09-2015 at 12:27.
Reply With Quote
  #2  
Old 28-09-2015, 12:14
RPG29's Avatar
RPG29 RPG29 is offline
Đã tốn tiền
 
Join Date: 07-2010
Posts: 1,697

Dùng message queue như RabbitMQ, Gearman... etc làm middle để dispatch job cho worker. Trên frontend cứ push message vào queue, việc còn lại queue nó sẽ tự dispatch cái message đó cho con worker nào rảnh
Reply With Quote
  #3  
Old 28-09-2015, 12:21
catchimthangnaobantao catchimthangnaobantao is offline
K.I.A
 
Join Date: 01-2013
Posts: 306

Quote:
Originally Posted by RPG29 View Post
Dùng message queue như RabbitMQ, Gearman... etc làm middle để dispatch job cho worker. Trên frontend cứ push message vào queue, việc còn lại queue nó sẽ tự dispatch cái message đó cho con worker nào rảnh
mình hình dung ý bạn như sau:
Khi user đăng ký thành công thì mình sẽ viết code push cái message vào queue của Rabit (giả sử message chứa thông tin email của user), còn việc thật hiện hàm SendMail() thì nó nằm ở worker hả bạn ? Worker có phải là 1 app riêng không, nếu đúng vậy tức là có 2 app ( 1 cái web, 1 cái worker). Mình hiểu như vậy có đúng không bạn ?
Reply With Quote
  #4  
Old 28-09-2015, 12:25
RPG29's Avatar
RPG29 RPG29 is offline
Đã tốn tiền
 
Join Date: 07-2010
Posts: 1,697

Quote:
Originally Posted by catchimthangnaobantao View Post
mình hình dung ý bạn như sau:
Khi user đăng ký thành công thì mình sẽ viết code push cái message vào queue của Rabit (giả sử message chứa thông tin email của user), còn việc thật hiện hàm SendMail() thì nó nằm ở worker hả bạn ? Worker có phải là 1 app riêng không, nếu đúng vậy tức là có 2 app ( 1 cái web, 1 cái worker). Mình hiểu như vậy có đúng không bạn ?
Yep, worker nó là một cái app (service, daemon...) chạy ngầm, luôn lắng nghe message từ queue.
Reply With Quote
Đang tải...
  #5  
Old 28-09-2015, 12:51
Sergyi Nya Sergyi Nya is offline
Đã tốn tiền
 
Join Date: 04-2013
Posts: 954

Mình dùng Elixir cái mailer nó chạy trong một cái process riêng cho nên mấy chuyện này mình không phải nghĩ. Buồn thế :(
Reply With Quote
  #6  
Old 28-09-2015, 13:25
foreveralone's Avatar
foreveralone foreveralone is offline
Senior Member
 
Join Date: 07-2011
Posts: 509

Quote:
Originally Posted by Sergyi Nya View Post
Mình dùng Elixir cái mailer nó chạy trong một cái process riêng cho nên mấy chuyện này mình không phải nghĩ. Buồn thế :(
Bữa chê Elixir chưa đủ mature um sùm mà giờ đã đi khoe rồi
Reply With Quote
  #7  
Old 28-09-2015, 13:25
RPG29's Avatar
RPG29 RPG29 is offline
Đã tốn tiền
 
Join Date: 07-2010
Posts: 1,697

Quote:
Originally Posted by Sergyi Nya View Post
Mình dùng Elixir cái mailer nó chạy trong một cái process riêng cho nên mấy chuyện này mình không phải nghĩ. Buồn thế :(
.
Reply With Quote
  #8  
Old 28-09-2015, 13:43
Sergyi Nya Sergyi Nya is offline
Đã tốn tiền
 
Join Date: 04-2013
Posts: 954

Quote:
Originally Posted by foreveralone View Post
Bữa chê Elixir chưa đủ mature um sùm mà giờ đã đi khoe rồi
Cái này là điểm mạnh của Erlang/BEAM mà có phải của riêng Elixir đâu? Mà erlang thì cũng có ít nhất 20 năm tích lũy rồi =))

Btw, phần lớn thư viện của Elixir bây giờ mà có khả năng dùng được thì đều thuộc dạng hoặc là NIF (C library) hoặc là interface cho erlang library, thế mà tổng lại cũng chỉ khoảng hơn 700 cái. Ngồi so với ruby hay nodejs thì bị chê là đúng rồi. Mà nói chung mình tới giờ cũng vẫn không khuyến khích việc sử dụng Elixir, hướng dẫn thiếu hụt nếu không chịu khó tìm kiếu hoặc đọc document thì tìm giời. Kiểu như postgres array support trong Ecto ấy, tìm mãi mới ra là cần khai báo kiểu `field :field, {:array, :integer}` gì gì đấy thì mới dùng được... nghe đâu đó vì đây là for internal use, cho nên chúng nó không viết document :|

Last edited by Sergyi Nya; 28-09-2015 at 14:20.
Reply With Quote
  #9  
Old 29-09-2015, 14:44
cuoc_song's Avatar
cuoc_song cuoc_song is offline
Đã tốn tiền
 
Join Date: 03-2007
Posts: 2,741

Mình mới đọc cái này nhưng chưa có dịp thử :v. Bác làm chuột bạch đi
http://hangfire.io/
Reply With Quote
  #10  
Old 29-09-2015, 15:03
momotico's Avatar
momotico momotico is offline
Senior Member
 
Join Date: 09-2014
Posts: 685

Quote:
Originally Posted by RPG29 View Post
Dùng message queue như RabbitMQ, Gearman... etc làm middle để dispatch job cho worker. Trên frontend cứ push message vào queue, việc còn lại queue nó sẽ tự dispatch cái message đó cho con worker nào rảnh
bác thớt hỏi windows mà bác, windows thì cứ dùng luôn hàng có sẵn: MSMQ
Reply With Quote
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT +7. The time now is 03:29.
Chịu trách nhiệm nội dung: Bạch Thành Trung © 2019 Công ty TNHH Thật Vi Diệu
ĐC tầng 4, số 6-8 Đường D2, Bình Thạnh, Hồ Chí Minh, Việt Nam - SĐT 0981323799 - MST 0313906593
Giấy phép thiết lập MXH số 334/GP-BTTTT, Ký ngày: 19/08/2019