Java, wysyłanie wiadomości mailowych, architektura

1

Cześć,

Przymierzam się do utworzenia komponentu, który w głównej mierze ma odpowiadać za generowanie i wysyłanie wiadomości mailowych (z załącznikiem). Będą to wiadomości z resetu hasła (wysoki priorytet), powiadomienia o aktualizacjach spotkań (niższy priorytet), powiadomienia o otrzymaniu wiadomości wewnętrznej (krytyczne), etc. Rozwiązanie musi działać stabilnie i szybko, opóźnienia w dostarczeniu wiadomości powyżej powiedzmy 5 minut od zdarzenia nie wchodzą w grę.

Nie jestem pewna, jaka architektura byłaby odpowiednia. Czy rozważać w ogóle wysyłanie wiadomości w odrębnym wątku, czy od razu kierować się w stronę JMS i MDB? Może jakieś inne propozycję? Dodam, że tych wiadomości może być ok 1000 na dobę.

Dodam jeszcze, że mamy 2 instancje systemu, działające z load balancerem. Jak to skonfigurować, żeby nie generowało podwójnych danych?

Edit:
Zapomniałam o bardzo ważnej rzeczy: musi być możliwość weryfikacji czy wszystkie wiadomości zostały poprawnie wysłane i ewentualnie ponowienie próby wysłania.

1

Myślę że przy 1000 wiadomości na dobę, nie będzie problemu z żadną wybraną drogą a i JMS w 100% się sprawdzi. Mówisz że wysłanie maila 5 minut po zdarzeniu nie wchodzi w grę (chociaż nie wiem jak mocno obciążona musiała by być maszyna aby wygenerować takiego laga) to może zamiast maili (które najczęściej odświeżają się co 15 min) zainteresować się SMS? Kwestia tylko czy masz fizyczny dostęp do maszyny. Jeśli tak koszt zakupu modemu (taki np. od mobilnego internetu) to grosze a karta wyniesie parę złoty za miesiąc (nielimitowane sms). Dzięki temu opóźnienie między zdarzeniem a wiadomością wyniesie kilkanaście sekund (nie licząc dni świątecznych :D). Jeśli jednak wolisz maila, to tak jak pisałem chyba żadna technologia którą znam Cię nie zawiedzie.

0

@NickOver dzięki za odpowiedź.

chociaż nie wiem jak mocno obciążona musiała by być maszyna aby wygenerować takiego laga

Obsługę wiadomości w tym momencie robi custom module na CMS, do którego łączy się system nad którym pracuję. Ten moduł został utworzony blisko 10 lat temu, więc 5-minutowe opóźnienia nie są takie nadzwyczajne.

Z uwagi na specyfikę systemu, muszę pozostać przy mailach. Czy mógłbyś wymienić pozostałe znane Ci technologię, które ewentualnie znalazły by tu zastosowanie?

0

A mogłabyś napisać coś więcej o środkach jakimi dysponujesz?
Najlepiej, aby wyeliminować jakiekolwiek opóźnienie było by zaimplementować SMTP (chociaż z tego co widzę java ma metody do tego http://stackoverflow.com/questions/73580/how-do-i-send-an-smtp-message-from-java). Jeśli natomiast goni Cię czas a serwer jest na linuxie możesz użyć aplikacji sendmail. Chociaż tu mogą pojawić się problemy z autoryzacją (jeśli coś jest ustawione nie tak gail wrzuci wiadomość do spamu). Kolejnym rozwiązaniem jest natywna aplikacja po stronie maszyny (coś jak sendmail, lecz bardziej rozbudowane, jednakże przy wyborze najlepszej niestety nie pomogę). Tak jak wyżej odpalanej z poziomu "konsoli" systemu. Znalazłem jeszcze coś takiego https://github.com/bbottema/simple-java-mail. Ale musiałabyś upewnić się jaki delay może powodować.

0

Zasoby systemu:

  • działający obecnie serwer SMTP
  • IIS (loadbalancer)
  • 2x tomcat na Windows Server
  • MSSQL
  • pod spodem CMS (OpenText)

Jestem w stanie wysyłać z systemu wiadomości mailowe przez java mail API (już przetestowałam). Obawiam się jednak, że nie będzie to najbardziej efektywne rozwiązanie problemu.

0

Jeśli na serwerze jest już działający serwer, to czemu nie użyć jego jako sendera?

0

Wydaje mi się, że coś mi umyka. :(

Jeśli na serwerze jest już działający serwer, to czemu nie użyć jego jako sendera?

Na zasadzie np. reset hasła -> wygeneruj maila -> wyślij(Java mail API)?
Mogę wysyłać przez ten serwer, ale chciałabym coś niezawodnego do przygotowania i wypchnięcia wiadomości do SMTP.

Jeśli dobrze rozumiem JMS i MDB (dopiero rozpoznaję tę technologię więc bądźcie litościwi jeśli coś pomieszałam) działa to tak, że komponent przygotowuje wiadomość i wrzuca ją do kolejki, następnie dalej sobie działa nie czekając na obsługę wiadomości. Klient, który nasłuchuje nowych wiadomości, podejmuje ją i procesuje (np. wysyła maila).
Czy to nie ma sensu?

0

to może zamiast maili (które najczęściej odświeżają się co 15 min) zainteresować się SMS?

To już chyba lepiej skorzystać z webowego SMS API. To nie są drogie usługi, a są pewne. Poza tym ktoś inny dba, żeby to wszystko działało bezawaryjnie.

0

@shagrin Nie wiem jak działa java mail api, a na szybko w dokumentacji nie mogłem tego znaleźć. Chociaż jest bardzo prawdopodobne że tworzy kolejkę, aby ustrzec się podmianie treści czy nadawcy.Zawsze możesz napisać dość brzydką klasę (bez żadnych getterów i setterów) która będzie miała jedną publiczną metodę która to będzie wysyłała maila, tz. otworzy połączenie z serwerem, poda adres nadawcy, poda adres odbiorcy, poda treść i zamknie połączenie. Po dokładny standard SMTP odsyłam do RFC5321.
Chociaż nadal dziwi mnie to że klient smtp tak długo zwlekał z wysłaniem. Możliwe są 4 przyczyny (przynajmniej tyle przychodzi mi do głowy):
-serwer jest obciążony
-serwer ma uszkodzony dysk przez co cały odczyt jest wolny
-klient smtp ma jakiś dupny limit (typu 1 wiadomość na 3 min)
-klient jest źle napisany i coś po drodze psuje
Spróbował bym wyeliminować pierwsze 3 możliwości bo nie ma sensu wymyślać koła na nowo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1