Agenda Opnåede resultater Logging af backendkald Analyse af logs Implementering af caching Demo af prototype Videre arbejde i praksis Logging og analyse i praksis Caching i praksis Eksempel på anden analyse
Resultater for logging En væsentlig bedre placering af ansvaret for logging i forhold til ad-hoc logging Bedre kvalitet i logging (flere detaljer) Mindre arbejde ved at implementere i eksisterende applikationer Minimalt performance impact Erfaring med dynamic proxy til håndtering af ”cross-cutting concerns”
Resultater for analyse Bedre og mere automatisk analyse af ”duplicate invocations” end en ad-hoc analyse (fokus på de to ”cases” fra ad-hoc analyserne) Opbygning af CallSimulator – der giver et grundlag for test af caching Skabt arkitektonisk grundlag for andre analyser (mere om det senere)
Resultater for caching Bedre kendskab til caching ”fundamentals” både generelt og i en Java kontekst En arkitektur der transparent indskyder en central caching for backendkald og isolerer caching implementationen En effektiv caching af duplicate invocations, som var fokus for prototypen
Demo af prototype CallSimulator med/uden cache Skift af strategi/size (learning tests af konfiguration) Coverage for prototypen
Logging og analyse i praksis InvocationLogger ville kunne gøres ”stateless” ved fx at logge til Log4J (fx til systemout.log) Forskellige reporters ville fortsat kunne være observers på InvocationLogger: En SlowResponseReporter, der fx logger langsomme kald i forhold til et threshold DuplicateInvocationReporter, ville selv skulle holde state – fx baseret på en intern cache af invocations med timeout på 10 min (en netbank ”session”) LogAnalyzer er ikke brugbar (kræver state) – men var driver for test og design af Reporters
Caching i praksis Klassifikation af levetid i cache – data der opdateres løbende fx aktiekurser En løsning kunne være et CacheableDao interface med en getCacheTimeToLive metode
Caching i praksis (fortsat) Filtrering af CUD i forhold til caching En regularexpression filtrering af ”standard” metodenavne (get.*, hent.* delete.*, update.* osv.) Evt. en metode på CacheableDao – getNoCacheMethodNamePattern Evt. flere interfaces NonCacheableDao – som efterfølgende kunne anvendes til at vælge en caching strategi i DaoInvocationHandler
Caching i praksis (fortsat) LiveCacheStatistics (fra Ehcache) Overvågning af størrelse i memory – kunne bruges til dynamisk at regulere op og ned i størrelse (for fx at beskytte heap) getCacheMissCountExpired – kunne måske bruges til at styre størrelse på en LFU cache API til LiveCacheStatistics API til LiveCacheStatistics
Eksempel på anden analyse Analyse af ”næsten” identiske kald Motivation – stort spild af ressourcer Målet – bedre design af ”backend” interfaces Mulige løsning gennemløb af indhold på return object med reflection, hvor der laves en simpel optælling af antal ”equals”, der er true i forhold til antal værdier