Rilevamento automatico del ciclo in tempo reale delle chiamate di funzione

8

Sto correndo mentalmente contro un muro quando cerco di pensare a un modo per risolvere questo problema. Nel mio lavoro elaboriamo i dati dei clienti attraverso una complessa logica di ragionamento. A volte questa logica causerà un loop infinito. In realtà sappiamo come rimuovere solo parte della logica che causerà questo, ma per motivi politici non siamo autorizzati a toccare la logica .... sigh

Ad ogni modo, ho deciso di aprire la mia bocca e suggerire che ci deve essere un modo per rilevare i cicli nelle chiamate logiche, quindi qui ho il compito di trovare un modo per rilevare i cicli nella logica e quindi passare oltre il ciclo se succede.

Ho elaborato un piano approssimativo, ma volevo vedere se qualcuno delle persone intelligenti avesse qualche input.

Per iniziare, ho già accesso a ogni chiamata di funzione e ai suoi input tramite la nostra registrazione, quindi il mio piano era il seguente:

  1. trova un modo per cancellare le combinazioni di chiamata / input di funzione
  2. mappa le combo di cui sopra in un ID di chiamata
  3. tieni un elenco di tutte le chiamate effettuate finora
  4. utilizza la mappa da 2 e l'elenco da 3 per creare una rappresentazione potenzialmente ciclica delle chiamate
  5. Esegui l'algoritmo di rilevamento del ciclo di Brent in questo elenco per verificare se è avvenuto un ciclo.

Mi sento come se fosse abbastanza contorto. Mi chiedevo se gli altri avessero qualche input.

Il linguaggio di programmazione per questo è Java e la logica è in Drools. Con gli ascoltatori di eventi posso vedere esattamente quali regole attivare e i fatti che li attivano. A volte nessuna regola attiva solo i gruppi di regole attivati. Pensavo che mantenendo un elenco di tutte le attivazioni perverse posso ricostruire l'ordine di chiamata in qualcosa di simile a un elenco collegato e applicare un algoritmo di rilevazione del ciclo. Quindi, dopo ogni attivazione, devo controllare se questa attivazione ha avviato un ciclo.

    
posta Hangman4358 24.01.2017 - 19:23
fonte

1 risposta

1

Sono d'accordo sul fatto che questo appare eccessivamente convoluto.

Penso che sarebbe abbastanza difficile identificare correttamente tutte le situazioni di loop. Non riuscire a identificare un loop potrebbe non essere un interruttore di rotta se si ha anche un timeout su cui ricorrere. Tuttavia, uccidere in modo errato un processo che non era un ciclo potrebbe essere piuttosto problematico.

Inoltre, probabilmente equivale ad alterare la logica che non ti è permesso di toccare, solo in un modo davvero indiretto. Anche se mi rendo conto che la differenza potrebbe soddisfare le preoccupazioni politiche.

Sarei piuttosto riluttante a tentare questo approccio. Risparmiare un po 'di tempo rispetto a un timeout sembra improbabile che sia una giustificazione commerciale sufficiente per la complessità dell'implementazione di questo e dei rischi coinvolti.

    
risposta data 20.04.2017 - 14:52
fonte

Leggi altre domande sui tag