Chmura8 min czytania

Od zdarzeń do znaczenia: praktyczny sposób na dopasowanie czasowe w systemie IoT

Od zdarzeń do znaczenia: praktyczny sposób na dopasowanie czasowe w systemie IoT

Jak lubimy powtarzać: „Nie ma IoT bez T”. Urządzenia są fundamentem każdego systemu IoT, dlatego tak wiele firm (w tym Rebels Software) koncentruje się na projektowaniu sprzętu. To samo dotyczy litery „I”, czyli internetu z jego protokołami, platformami chmurowymi i dashboardami.

Wszystko to jest jednak tylko środkiem do celu. Infrastruktura, przesyłanie komunikatów i przechowywanie danych służą czemuś ważniejszemu: odpowiadaniu na prawdziwe pytania i rozwiązywaniu prawdziwych problemów. Niezależnie od tego, z jakim wycinkiem rzeczywistości pracujesz, zwykle sprowadza się to do jednego kluczowego wyzwania: korelowania zdarzeń w czasie.

Przykłady z życia, w których czas jest kluczowym problemem

Na pierwszy rzut oka pewnie unosisz brwi, ale zostań ze mną i spójrz na poniższe przykłady.

Przemysł spożywczy

Czy ta partia czekolady została temperowana zgodnie z naszymi standardami?

Temperowanie to kontrolowany proces podgrzewania i schładzania w produkcji czekolady. Dzięki utrzymywaniu precyzyjnych zakresów temperatur w czasie czekolada ma połysk, łamie się z charakterystycznym trzaskiem i jest odporna na wykwity.

Żeby odpowiedzieć na to pytanie, musimy skorelować partię czekolady z przedziałami czasu, które spędziła w tych zakresach temperatur.

Energetyka

Czy ten akumulator był ładowany zgodnie z zalecanym profilem?

Kondycja akumulatora zależy nie tylko od napięcia czy prądu, ale też od tego, jak te wartości zmieniają się w czasie. Warunki bezpieczne w krótkim okresie mogą stać się szkodliwe, jeśli trwają zbyt długo.

Żeby na to odpowiedzieć, korelujemy w czasie ładunek, prąd, poziom elektrolitu i temperaturę, a następnie porównujemy wynik z krzywą ładowania zalecaną przez producenta.

Logistyka

Czy ta przesyłka była przechowywana i transportowana w bezpiecznych warunkach?

Towary łatwo psujące się znoszą krótkie odchylenia temperatury, ale dłuższe przebywanie poza określonymi progami może spowodować nieodwracalne szkody.

Żeby odpowiedzieć na to pytanie, musimy skorelować w czasie lokalizację, temperaturę i czas trwania przekroczeń, a nie tylko sprawdzić, czy limity zostały przekroczone w którymkolwiek pojedynczym punkcie.

Ochrona zdrowia

Czy to urządzenie działało w zakresie zamierzonych parametrów terapeutycznych?

Urządzenia medyczne mogą tolerować krótkie odchylenia, ale długotrwałe lub powtarzające się odchylenia mogą wpłynąć na skuteczność terapii albo bezpieczeństwo pacjenta. Żeby to ocenić, korelujemy w czasie telemetrię urządzenia i jego tryby pracy, weryfikując zamierzony profil terapii.

Wzorzec jest zawsze ten sam: kotwice (kluczowe zdarzenia), kandydaci (powiązane sygnały) i relacje czasowe między nimi.

Czy da się sprowadzić ten problem do jego istoty?

Poddomena Twojej domeny, udostępniona jako open source

Przez lata budowaliśmy systemy IoT w różnych branżach i wciąż trafialiśmy na to samo wyzwanie: korelowanie danych w czasie. Zawsze wydawało się ono specyficzne dla danej domeny, aż do momentu „aha” podczas prac nad wydajnością, który skłonił nas do wydzielenia głównej idei do otwartej biblioteki.

Efektem jest Rebels.Temporal, biblioteka C# zbudowana na jasnej filozofii:

Zero alokacji na gorących ścieżkach. Skala IoT wymaga przewidywalnej wydajności. Główne algorytmy dopasowania niczego nie alokują, więc pamięć pozostaje w pełni pod Twoją kontrolą.

Solidne podstawy matematyczne. Nie wymyślamy doraźnych reguł opisujących, jak interwały mają się do siebie. Korzystamy z algebry interwałów Allena, standardowego formalizmu wnioskowania o czasie. Reprezentujemy ją jako TemporalRelation. Trzynaście relacji obejmuje każdy możliwy sposób, w jaki mogą się do siebie odnosić dwa przedziały czasu. Możesz filtrować, które z nich chcesz otrzymywać. Bez niespodzianek.

Czysta logika domenowa. Żadnych zależności poza biblioteką klas bazowych .NET. Żadnych założeń co do Twojego brokera komunikatów, bazy danych czy dostawcy chmury. Żadnego uzależnienia od dostawcy.

Czym biblioteka nie jest: platformą, frameworkiem ani bazą danych. To narzędzie, które wpasowuje się w warstwę Twojej aplikacji.

Jak z niej korzystać

Nie wszystkie korelacje są takie same. Zdarzenia mogą być chwilowe albo rozciągać się w czasie, czasem po jednej stronie, czasem po obu. Biblioteka obsługuje wszystkie trzy przypadki, a wybór właściwego ma znaczenie.

Punkt do punktu

Obie strony są chwilami, czyli zdarzeniami, które nastąpiły w konkretnym momencie.

Kiedy tego używać:

  • Korelowanie poleceń z potwierdzeniami. Wysyłasz „otwórz zawór” o 14:00:01 i chcesz znaleźć potwierdzenie „zawór otwarty” w ciągu 2 sekund.
  • Dopasowywanie odczytów czujników z różnych urządzeń. Czujnik temperatury A raportuje o 14:00:00.123, czujnik wilgotności B o 14:00:00.156. Czy są na tyle blisko, żeby uznać je za równoczesne?
  • Łączenie wpisów w logach z rozproszonych usług. Żądanie trafiło do usługi A w chwili T. Kiedy dotarło do usługi B?

Punkt do interwału

Jedna strona jest chwilą, druga ma czas trwania.

Kiedy tego używać:

  • Czy ten odczyt czujnika nastąpił w trakcie partii produkcyjnej? Punkt o 14:32:17 kontra partia #4471 od 14:00 do 15:30.
  • Czy alarm włączył się podczas prac serwisowych, czy był to prawdziwy incydent?
  • Która zmiana pracowała, gdy wystąpił błąd? Zmiany są interwałami, błąd jest punktem.

Kierunek ma znaczenie: Biblioteka obsługuje oba kierunki. Point.With.Intervals traktuje punkty jako kotwice - „dla każdego odczytu znajdź partię, do której należy”. Intervals.With.Points traktuje interwały jako kotwice - „dla każdej partii znajdź wszystkie odczyty, które nastąpiły w jej trakcie”.

Te same dane, różne pytania.

Interwał do interwału

Obie strony mają czas trwania. Tu do gry wchodzi algebra interwałów Allena.

Dwa interwały mogą pozostawać ze sobą w relacji na dokładnie 13 sposobów. Nie 12, nie 14. Allen udowodnił to w 1983 roku i od tamtej pory jest to fundament wnioskowania o czasie.

Kiedy tego używać:

  • Walidacja procesu. Podgrzewanie musi się zakończyć, zanim zacznie się chłodzenie. Każde nakładanie się sygnalizuje problem.
  • Sprawdzanie zgodności. Kalibracja musi obejmować cały cykl produkcyjny.
  • Analiza przekazania zmiany. Czy jedna zmiana skończyła się dokładnie wtedy, gdy zaczęła się następna, czy była między nimi przerwa?
  • Filtrowanie relacji. Zwykle interesuje Cię konkretne pytanie, a nie wszystkie 13 relacji, na przykład czy A wydarzyło się przed B albo czy je zawierało.

13 relacji Allena dzieli się na grupy:

Grupa Relacje Znaczenie
Rozłączne Before, After Brak jakiegokolwiek nakładania się
Stykające się Meets, MetBy Koniec jednego = początek drugiego
Nakładające się Overlaps, OverlappedBy Częściowe nakładanie się
Zawieranie Contains, During Jeden w całości wewnątrz drugiego
Wspólna granica Starts, StartedBy, Finishes, FinishedBy Ten sam początek lub ten sam koniec
Tożsamość Equal Identyczne interwały

Każdy wynik dopasowania mówi dokładnie, która relacja została znaleziona. Bez zgadywania.

Tolerancja

Znaczniki czasu w prawdziwym świecie są niedoskonałe. Dryf zegarów, opóźnienia i różnice w próbkowaniu sprawiają, że „równoczesne” zdarzenia rzadko idealnie się pokrywają.

TimeTolerance rozwiązuje ten problem, poszerzając okno dopasowania o dwie granice: Before i After.

Trzy metody fabryczne obsługują typowe przypadki:

Metoda Before After Zastosowanie
Symmetric Czas trwania Czas trwania Dryf zegara, ogólna nieostrość
Forward only 0 Czas trwania Przyczynowość: odpowiedź musi przyjść po poleceniu
Backward only Czas trwania 0 Spojrzenie wstecz: znajdź, co poprzedziło to zdarzenie

Tolerancja dla punktów

Gdy stosujesz tolerancję do punktu, zamieniasz go w wirtualne okno.

Ustawienie tolerancji czasowej dla jednej kolekcji zamienia operację w dopasowanie interwał do punktu albo punkt do interwału, zależnie od ustawienia. Gdy zastosujesz obie tolerancje, wynik podlega algebrze Allena, a obie kolekcje są traktowane jako interwały.

Tolerancja dla interwałów

Tolerancja dla interwałów rozszerza ich granice.

Zasady są proste:

  • Before odejmuje od Start (interwał zaczyna się wcześniej).
  • After dodaje do End (interwał kończy się później).
  • ForwardOnly wydłuża tylko koniec.
  • BackwardOnly wydłuża tylko początek.
  • Symmetric rozszerza interwał w obu kierunkach.

Łatwość adaptacji

Cztery rzeczy, na które warto zwrócić uwagę:

  1. Twoje typy, Twoje dane. Zaimplementuj ITemporalPoint lub ITemporalInterval. Biblioteka współpracuje z Twoim istniejącym modelem domenowym.
  2. Wydajność jest jawna. InputOrdering określa oczekiwania. Posortowane dane umożliwiają dopasowanie w czasie O(n+m), nawet 250× szybciej. Kolejność jest walidowana w czasie działania.
  3. Bufor należy do Ciebie. Żadnych ukrytych alokacji ani niespodzianek z GC. Stos, pula albo własna strategia - Ty wybierasz.
  4. Elastyczność. Możesz zaimplementować własnego visitora przez IMatchVisitor.

Kiedy z niej korzystać

Biblioteka jest elementem składowym, a nie aplikacją. Oto, gdzie pasuje.

Przetwarzanie wsadowe

Masz bazę danych z odczytami czujników i rekordami produkcyjnymi i co jakiś czas musisz je skorelować, żeby zidentyfikować partie, przekroczenia lub anomalie.

To klasyczny przypadek użycia: pobierz dane, posortuj je według znacznika czasu (albo użyj InputOrdering.None), uruchom dopasowanie i zapisz wyniki. Dzięki zerowym alokacjom możesz przetwarzać miliony rekordów bez presji na GC.

Krok w potoku pozyskiwania danych

Dane napływają nieprzerwanie i często trzeba je wzbogacić przed zapisaniem, na przykład dodając kontekst albo oznaczając anomalie.

Biblioteka naturalnie wpasowuje się w taki potok: odczyty są dopasowywane do aktywnych partii, a wzbogacone dane płyną dalej. Niskie opóźnienia i przewidywalne alokacje utrzymują stabilny p99.

Alerty i wykrywanie anomalii

Niektóre alerty potrzebują kontekstu czasowego. Sam próg nie wystarczy, bo połączenie faz i czasów trwania zmienia znaczenie.

Biblioteka dostarcza prymitywy do wyrażania takich warunków. Zajmuje się korelacją czasową, a Ty definiujesz, co uznajesz za anomalię.

Analiza po incydencie

Coś poszło nie tak i musisz zrozumieć dlaczego.

Pobierz odpowiedni zakres czasu, skoreluj zdarzenia z różnych źródeł i zbuduj oś czasu. Biblioteka pomaga odpowiedzieć na pytanie, co jeszcze działo się, gdy wystąpiło X, bez pisania za każdym razem jednorazowego kodu korelacji.

Gdzie się nie sprawdzi

Biblioteka działa na kolekcjach w pamięci. Nie jest silnikiem strumieniowym i nie utrzymuje okien na nieskończonych strumieniach. Nie jest bazą danych i nie utrwala ani nie indeksuje danych.

Do ciągłej korelacji strumieniowej użyj narzędzi takich jak Kafka Streams albo Azure Stream Analytics, które obsłużą okna czasowe, a w każdym oknie wywołuj Rebels.Temporal do złożonego dopasowania. Do korelacji historycznych wykorzystaj zadania wsadowe albo zapisane wyniki.

Biblioteka to logika korelacji. Otaczającą ją infrastrukturę wybierasz Ty.

Dlaczego open source?

Rozwiązania IoT wymagają zaufania. Sterują fabrykami, zarządzają flotami i monitorują zdrowie, więc stawka jest realna.

Udostępnienie Rebels.Temporal jako open source to świadoma decyzja:

  • Przejrzystość buduje zaufanie. Możesz przejrzeć każdą linię algorytmów dopasowania, zrozumieć `TimeTolerance.Symmetric(TimeSpan.FromSeconds(2))` i samodzielnie zweryfikować relacje Allena. Żadnych czarnych skrzynek.
  • Brak uzależnienia od dostawcy w sprawach fundamentalnych. Podstawowa logika korelacji czasowej nie powinna zależeć od zastrzeżonych usług. Weź bibliotekę, a w razie potrzeby zrób jej forka. Jest dostępna na licencji Apache 2.0.
  • Społeczność ją ulepsza. Nowe przypadki brzegowe, usprawnienia wydajności i nietypowe przypadki użycia, które przesuwają granice, pojawiają się dzięki open source. Niektóre pomysły są już zaplanowane i śledzone w ADR-14.

To nasze CV. Wolimy pokazywać niż opowiadać i planujemy pokazać więcej.

Nasz biznes polega na pomaganiu zespołom w budowie tego, co znajduje się nad tą warstwą: wiedzy domenowej, architektury i integracji dopasowanych do Twojej branży.

Twój ruch

Niezależnie od tego, czy budujesz nowe systemy, czy modernizujesz systemy legacy, korelacja czasowa znajduje się w centrum Twojej architektury. Odpowiada na pytanie, co wydarzyło się razem i w jakiej kolejności.

Jeśli zrobisz to źle, będziesz debugować problemy z zależnościami czasowymi, zamiast dostarczać wartość. Jeśli zrobisz to dobrze, zyskasz fundament, na którym możesz budować z pewnością.

My swój fundament udostępniliśmy jako open source. Weź go. Używaj go. Kwestionuj go.

A kiedy przyjdzie pora na kolejny krok, jesteśmy tutaj.

  • Chmura
  • Open source
  • C#
  • Pozyskiwanie danych
  • Interpretacja
  • Znaczenie
  • Przetwarzanie