Klaster opart jest o technologie Docker Swarm. Standardowo działają w nim 3 węzły będące menadżerami. Poniżej znajduje się opis poszczególnych stacków działających w klastrze oraz komponentów, takich jak baza danych, działających poza nim.

WellBot

WellBot to narzędzie pozwalające na projektowanie czatbota oraz umożliwiające jego działanie. WellBot wdrażany jest jako część klastra. Jego stack składa się z następujących serwisów:

  • WellBot API - serwer stworzony w technologii Node.js. Łączy się z bazą danych oraz Redisem. Utrzymuje połączenie WebSocket z aplikacją przeglądarkową. Oprócz tego zleca zadania wytrenowania nowego modelu do pracy działającej w AWS Batch - po zakończeniu trenowania AWS Batch wykonuje zapytanie zwrotne z plikiem modelu. Ten kontener jest również odpowiedzialny za komunikację z serwisami samego bota - wysyłanie wiadomości, odbieranie odpowiedzi i przekazywanie ich do klienta (w tym przypadku API Humanized).
  • WellBot App - interfejs umożliwiający projektowanie czatbota stworzony jako SPA. W klastrze działa jako proces Nginxa serwujące pliki statyczne (HTML, CSS, JS, itp.).
  • bot testowy, bot produkcyjny - dwa kontenery w których działają serwery bota (Rasa). Są one odpowiedzialne za wykrywanie intencji zawartej w wypowiedzi użytkownika oraz przewidywanie akcji bota w odpowiedzi na konkretną intencję, czyli po prostu prowadzenie dialogu z użytkownikiem.
  • Sentence normalizer - napisany w Javie serwer udostępniający usługi do poprawiania błędów językowych, ortograficznych oraz lematyzacji wypowiedzi.

Humanized

Humanized to narzędzie dla konsultantów, pozwalające na obsługę rozmów z użytkownikami oraz zarządzanie działaniem bota w tych rozmowach. Humanized wdrażany jest jako część klastra. Jego stack składa się z następujących serwisów:

  • Humanized API - serwis API systemu czatowego. W środku działa serwer Node.js. Ten kontener łączy się z bazą danych oraz Redisem (wykorzystywanym do koordynacji WebSocketów podczas skalowania oraz koordynacji background jobów). Wysyła również zapytania do API WellBot'a oraz utrzymuje połączenie WebSocket z aplikacją przeglądarkową oraz widgetem (czat dla klienta). Ten serwis może być skalowany wedle potrzeby.
  • Humanized App - interfejs czatu dla konsultantów. W klastrze działa jako proces Nginx'a serwujące pliki statyczne (HTML, CSS, JS, itp.).
  • Widget App - interfejs czatu dla użytkowników. Udostępnia SDK, które umożliwia osadzanie widgeta w istniejącym systemie klienta. W klastrze działa jako proces Nginx'a serwujące pliki statyczne (HTML, CSS, JS, itp.).

Load balancer

LB zaimplementowany przy użyciu programy Traefik używany jest do sterowania ruchem przychodzącym z zewnątrz. Oprócz balansowania ruchu działa jako reverse proxy przekierowujący zapytania do odpowiednich typów kontenerów na podstawie informacji zawartych w nagłówkach.

Monitoring

Do monitoringu działania systemy używane są narzędzia dostępne w ramach Elastic Stack. Komponenty takie jak Logstash i Kibana działają wewnątrz klastra. ElasticSearch wdrażany jest na maszynie działającej poza klastrem. Na wszystkich maszynach działają również procesy Metricbeat dostarczające informacje diagnostyczne.

Baza danych MongoDB

Baza danych MongoDB, służąca za centralny magazyn danych WellBot'a oraz Humanized'a, instalowana jest poza klastrem, standardowo w konfiguracji 3-węzłowej repliki. Na jednym z węzłów działa praca CRON, okresowo tworząca backup bazy danych.

Redis

Redis, instalowany poza klastrem jako 3 węzłowa replika z Sentinelami, jest odpowiedzialny za poprawną obsługę WebSocket w środowisku rozproszonym, prace wykonywane w tle oraz kolejki wiadomości. Korzystają z niego zarówno WellBot jak i Humanized.

Serwer NFS

Jako magazyn plików (np.tych przesyłanych przez konsultantów podczas prowadzenia rozmowy) wykorzystywany jest serwer NFS (EFS w przypadku AWS), montowany na żądanie w serwisach klastra.