4.5. Zwiększenie szybkości wysyłania dużych ilości maili
1) Konfiguracja domyślna.
Domyślnie istnieje jeden proces (Mailchecker) który odpowiada za odbiór i wysyłkę maili ze wszystkich aktywnych kont pocztowych zdefiniowanych dla operatorów.
Jest to wynikiem tego, iż domyślnie dla każdego definiowanego konta pocztowego na danej bazie, wartość w worker_email.mailchecker_id jest równa 0 i w pliku conf.xml (domyślnie C:\Program Files\BMS Creative\berberis_server\conf\services) wartość parametru mailchecker_id = 0 (patrz poniżej na pogrubiony tekst w konfiguracja Mailcheckera dla bazy maxima):
C:\Program Files\Java\jre6\bin\java.exe
-jar "C:\Program Files\BMS Creative\berberis_server\berberis_service\bin\schedule.jar" "C:\Program Files\BMS Creative\berberis_server\conf\services\conf.xml" schedule_test_v_6000
jdbc:postgresql:// localhost:5436/maxima 4
berberis
log/mailchecker_maxima.log
6
5
5
60
15
2
0
Inaczej mówiąc, Mailchecker skonfigurowany jak powyżej obsługuję wszystkie konta pocztowe dla których
worker_email.mailchecker_id=0
2) Utworzenie kilku Mailchecker’ów dla różnych grup kont pocztowych
Można zdefiniowane konta pocztowe podzielić na grupy i dla każdej z nich zdefiniować Mailchecker’a obsługującego jedynie konta należące do danej grupy.
Konto pocztowe należy grupować poprzez ustawienia dla nich jednej, tej samej wartości w worker_email.mailchecker_id
Następnie trzeba w pliku conf.xml dopisać pełne sekcje
[…]
oraz
[…]
i w 0 podać zamiast 0, wartość którą przypisaliśmy w worker_email.mailchecker_id
Przykład takiej konfiguracji dla bazy maxima:
- zatrzymuję usługę Berberis Service
- dla 3 kont, w tabeli worker_email, w kolumnie mailchecker_id ustawiam wartość równą 1
- do pliku conf.xml dopisuję nowe sekcje odpowiedzialne za uruchamianie dodatkowego Mailcheckera obsługującego konta z worker_email.mailchecker_id=1:
C:\Program Files\Java\jre6\bin\java.exe
-jar "C:\Program Files\BMS Creative\berberis_server\berberis_service\bin\schedule.jar" "C:\Program Files\BMS Creative\berberis_server\conf\services\conf.xml" maxima_mailchecker_id_1
jdbc:postgresql:// localhost:5436/maxima 4
berberis
log/mailchecker_maxima_id_1.log
6
5
5
60
15
2
1
- uruchamiam usługę Berberis Service
- w katalogu log (domyślnie C:\Program Files\BMS Creative\berberis_server\log) sprawdzam czy pojawił się plik logów o nazwie mailchecker_maxima_id_1.log i czy nie ma w nim niepokojących wpisów
Analogicznie jak w podanym przykładzie robię dla kolejnych grup kont pocztowych wykorzystując np. wartości mailchecker_id = 2 ,3 , ….
Wszystkie konta dla których worker_email.mailchecker_id pozostało równe 0, będą obsługiwane tak, jak do tej pory przez główny proces Mailcheckera, posiadającego w swojej konfiguracji wpis 0
3) Utworzenie osobnych Mailchecker’ów do odbioru i wysyłki maili dla różnych grup kont pocztowych
Mailchecker zdefiniowany jak w punkcie 2) obsługuje konta pocztowe z danej grupy, ale zajmuje się odbiorem i wysyłką maila jednocześnie. Jeżeli skrzynki pocztowe obsługiwane przez dany Mailchecker są bardzo duże (posiadają po kilka tysięcy maili), to etap sprawdzania tych skrzynek pocztowych pod kątem nowych maili, może zajmować wiele czasu, co może przełożyć się na wydłużenie czasu oczekiwania na wysłanie maili z Berberisa dla tych kont pocztowych.
Dlatego można dla danej grupy kont pocztowych skonfigurować dwa Mailchecker’y: jeden odpowiada za odbieranie maili, a drugi za wysyłanie. Oba pracują niezależnie od siebie.
Jak utworzyć taka konfigurację?
Na pewno będzie potrzebna jedna skrzynka pocztowa, z której nikt nie korzysta w rzeczywistości, nikt nie wysyła na nią maili. Będę tą skrzynkę nazywał skrzynką WIDMO. Będzie ona użyta w konfiguracji w celu eliminacji nieprawdziwych informacji o błędach w logach Mailchecker’ów – wyjaśnienie będzie zawarte później.
Przykładowe dane tego konta to:
Adres e-mail: widmo@example.pl
Serwer POP3: pop3.example.pl
Serwer SMTP: smtp.example.pl
Nazwa użytkownika: widmo@example.pl
Załóżmy, że chcę aby dane konto pocztowe zdefiniowane dla operatora miało osobnego Mailchecker’a do pobierania maili i osobnego do wysyłania.
Dane tego konta to:
Adres e-mail: mail@example.pl
Serwer POP3: pop3.example.pl
Serwer SMTP: smtp.example.pl
Nazwa użytkownika: mail@example.pl
Mimo, że konto jest jedno, to w kartotece operatora w Berberisie muszę zdefiniować je dwa razy: jako konto do odbioru poczty (IN) oraz jako konto do wysyłki poczty (OUT).
Nazwy IN i OUT zostały użyte jedynie na potrzeby wyjaśnienia mechanizmu konfiguracji opisanego w tym punkcie.
Rysunek przedstawia konfigurację konta mail@example.pl jako konta maili przychodzących (IN):
Komentarz:
- opcja „Tylko przychodzące” musi być zaznaczona; powoduje ona, że Mailchecker obsługujący to konto będzie zajmował się sprawdzaniem maili przychodzących w oparciu o dane wpisane w „Konto przychodzące”
Rysunek przedstawia konfigurację konta mail@example.pl jako konta maili wychodzących (OUT):
Komentarz:
- opcja „Domyślne” oznacza, że podczas pisania nowego maila - w przypadku gdy dany operator posiada kilka skrzynek pocztowych - to konto zostanie podpowiedziane jako domyślna skrzynka z której pisany mail zostanie wysłany
- w części „Konto przychodzące” podaliśmy dane konta WIDMO, ponieważ Mailchecker odpowiedzialny za obsługę tego konta do wysyłki (OUT) będzie również sprawdzał czy na skrzynce WIDMO nie ma nowych maili. Jeżeli – tak jak pisałem wyżej - konto WIDMO będzie zawsze puste, sprawdzenie takiego konta potrwa ułamek sekundy i nie opóźni wysłania maili
W efekcie jedna skrzynka pocztowa email@example.pl rozbita na kwa konta IN i OUT wygląda jak poniżej:
Teraz czas na konfigurację worker_email.mailchecker_id dla kont IN i OUT.
Wszystkie konta OUT przeznaczone na wysyłkę grupujemy razem wpisując unikalną wartości worker_email.mailchecker_id. Pozostałe konta IN możemy zostawić na domyślnym Mailchecker o id = 0 (czyli worker_email.mailchecker_id=0) lub rozbić na odrębne Mailchecker’y jeśli odbiór jest za wolny. (Korzystając z instrukcji zawartych w punkcie 2 tej instrukcji).
Dla omawianego wyżej przykładu:
Dla konta „IN mail@example.pl„ ustawiamy worker_email.mailchecker_id= 0
A dla konta „OUT mail@example.pl„ ustawiamy worker_email.mailchecker_id=99
Dla innych kont typu IN należących do tej samej grupy kont co „IN mail@example.pl” również ustawiamy worker_email.mailchecker_id=0
Dla innych kont typu OUT należących do tej samej grupy kont co „OUT mail@example.pl” również ustawiamy worker_email.mailchecker_id=99
Teraz zatrzymujemy usługę Berberis service.
Następnie definiujemy Mailcheckera odpowiedzialnego za wysyłanie maili z kont o worker_email.mailchecker_id=99 (proszę zwrócić uwagę na parametr interval i send_interval)
C:\Program Files\Java\jre6\bin\java.exe
-jar "C:\Program Files\BMS Creative\berberis_server\berberis_service\bin\schedule.jar" "C:\Program Files\BMS Creative\berberis_server\conf\services\conf.xml" maxima_mailchecker_OUT_id_99
jdbc:postgresql:// localhost:5436/maxima
berberis
log/mailchecker_maxima_OUT_id_99.log
6
5
60
5
15
2
99
Uruchamiamy usługę Berberis Service i sprawdzamy logi nowych Mailchecke’rów.