I ty też możesz mieć swoje dane w cache

873 views

Published on

Tysiące użytkowników, miliony zapytań HTTP, miliardy odwołań do bazy danych, dziesiątki tysięcy osobogodzin inwestowanych przez firmy na optymalizacje aplikacji webowych, miliony dolarów (czy też euro) wydawanych na infrastrukturę, wszystko to po aby nasz system zapewniał użytkownikom odpowiedni komfort pracy i zadowalający czas odpowiedzi.

I gdy już wszystkie optymalizacje zapytań do bazy danych zostaną zastosowane, indeksy wypolerowane na wysoki połysk, czasowa złożoność obliczeniowa wszystkich metod będzie dążyć do O(1), a system dalej nie będzie spełnił wyśrubowanych warunków SLA, zawsze pozostaje wyprawa na "ostatni przylądek dobrej nadziei", czyli pełne niebezpieczeństw i ekscytujących przygód krainy, gdzie wasze dane będą na was czekać w ultra wydajnych, skalowalnych i stabilnych serwerach cache.

Chciałbym was, drodzy słuchacze, łagodnie wprowadzić w świat cache. Cache dla aplikacji webowych, opowiedzieć o stosowanych topologiach, wykorzystaniach cache w poszczególnych warstwach aplikacji, świat algorytmów "cache eviction", rozproszonych serwerów cache (i "data grids") oraz znanych i też przemilczanych "sekretów" i problemów, z którymi się spotkacie podczas implementacji cache w waszym systemie. Wszystko z wykorzystaniem takich rozwiązań jak memcached, redis, infinispan i ehcache.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
873
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

I ty też możesz mieć swoje dane w cache

  1. 1. I ty też możesz mieć swoje dane w cache
  2. 2. work://lumesse twitter://j_palka blog://geekyprimitives.wordpress.com scm://bitbucket/kcrimson scm://github/kcrimson
  3. 3. Dla kogo ta prezentacja?
  4. 4. ...nigdy tego nie robiłeś...
  5. 5. ...nie wiesz z kim...
  6. 6. ...nie wiesz jak...
  7. 7. ...boisz się skutków ubocznych...
  8. 8. Czyli 116 rzeczy, które chciałbyś wiedzieć o cache, ale boisz się zapytać
  9. 9. Cache to najpowszechniej stosowana metoda optymalizacji systemów
  10. 10. Cache to najpowszechniej stosowana metoda optymalizacji systemów
  11. 11. … lecz zanim zaczniemy
  12. 12. ...cache eviction...
  13. 13. Sytuacja gdy założony rozmiar cache został przekroczony i niektóry elementy (pary klucz wartość) zostają z niego usunięte. W celu wyboru elementów, które zostaną usunięte wykorzystywane są różne algorytmy, takie jak LRU lub LFU
  14. 14. Least Recently Used
  15. 15. Least Frequently Used
  16. 16. Low Inter-reference Recency Set
  17. 17. First In First Out
  18. 18. ...cache invalidation...
  19. 19. Sytuacja gdy pewne elementy cache (pary klucz-wartość), nie są już dłużej aktualne, zostały usunięte lub też do danego klucza została przypisana nowa wartość. Pojęcie ważne dla rozproszonych cache, gdyż tego typu zdarzenia powinny być rozgłoszone do wszystkich węzłów cache
  20. 20. There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton
  21. 21. … a skoro już mowa o rozproszonych cache'ach
  22. 22. topologie cache
  23. 23. lokalny
  24. 24. zdalny
  25. 25. rozproszony
  26. 26. hybrydowy
  27. 27. ...cache expiry...
  28. 28. Sytuacja gdy danemu elementowi cache (para klucz wartość), został przypisany czas przez jaki ten element będzie dostępny w cache. Po tym czasie element jest usuwany z cache. Dosyć często „cache expiry” definiowany przez dwa parametry „TTL” i „idle time”
  29. 29. ...cache passivation... aka ...cache offloading...
  30. 30. Sytuacja gdy rozmiar cache został przekroczony, i wybrane element cache zostają zapisane na dysku lub do bazy danych. Są one nadal dostępne w cache, jednak dostęp do nich jest wolniejszy. Wykorzystywane są w tym przypadku podobne algorytmy jak podczas „cache eviction”
  31. 31. ...cache hit...
  32. 32. ...cache miss...
  33. 33. ...memcached... ...redis... ...ehcache... ...infinispan...
  34. 34. ...memcached...
  35. 35. root@ubuntu:/home/ubuntu# telnet localhost 11211 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. set klucz 0 600 6 123456 STORED get klucz VALUE klucz 0 6 123456 END delete klucz DELETED
  36. 36. slabs, pages & chunks
  37. 37. 250 bajtów per klucz 1048576 bajtów per wartość
  38. 38. dane ulotne jak motyle :)
  39. 39. poszczególne serwery memcached nic nie wiedza o swoim istnieniu
  40. 40. potrzeba cudu lub...
  41. 41. ...biblioteki klienckie...
  42. 42. Spymemcached https://code.google.com/p/spymemcached/ Xmemcached https://code.google.com/p/xmemcached/
  43. 43. import net.spy.memcached.MemcachedClient; public static void main(String[] args) throws Exception { MemcachedClient client = new MemcachedClient(new InetSocketAddress("192.168.56.56", 11211)); client.set("data", 600, new Date()); System.out.println(client.get("data")); client.delete("data"); }
  44. 44. … lub serwery proxy...
  45. 45. twemproxy moxi
  46. 46. M x N połaczeń lub „single point of failure”
  47. 47. ...redis...
  48. 48. ...to nie serwer cache...
  49. 49. ...to baza NoSQL...
  50. 50. ...a tak naprawdę to … „data structure server” - redis.io
  51. 51. ...z możliwościa ustawienia czasu wygaśnięcia...
  52. 52. ...czy to czyni z niego serwer cache?...
  53. 53. ubuntu@ubuntu:~$ redis-cli redis 127.0.0.1:6379> setex klucz 6000 wartosc OK redis 127.0.0.1:6379> get klucz "wartosc" redis 127.0.0.1:6379> del klucz (integer) 1 redis 127.0.0.1:6379> get klucz (nil) redis 127.0.0.1:6379>
  54. 54. ...replikacja...
  55. 55. ...persystencja...
  56. 56. „append only file” vs „snapshotting”
  57. 57. ...transakcje?...
  58. 58. ...transakcje?...
  59. 59. Jedis https://github.com/xetorthio/jedis Jredis https://github.com/alphazero/jredis RJC https://github.com/e-mzungu/rjc Redis-protocol https://github.com/spullara/redis-protocol Lettuce https://github.com/wg/lettuce
  60. 60. ...high availability?...
  61. 61. ...redis sentinel... this autumn coming soon
  62. 62. ...ehcache...
  63. 63. ...JVM...
  64. 64. import net.sf.ehcache.CacheManager; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; public class LocalCache { public static void main(String[] args) { CacheManager cacheManager = CacheManager.create(); Ehcache cache = cacheManager.addCacheIfAbsent("users"); Element element = new Element("klucz", "wartosc"); element.setTimeToIdle(1000); element.setTimeToLive(10000); cache.put(element); System.out.println(cache.get("klucz")); cache.remove("klucz"); } }
  65. 65. ...replikacja, dystrybucja, masturbacja...
  66. 66. RMI, multicast, JGroups, JMS
  67. 67. ...transakcyjny..
  68. 68. ...cache offloading.. filesystem
  69. 69. ...jeśli nie JVM?... to co ?
  70. 70. import requests print requests.get("http://.../ehcache/rest/sampleCache2/1").text print requests.put("http://.../ehcache/rest/sampleCache2/1","Hello world!") print requests.delete("http://.../ehcache/rest/sampleCache2/1")
  71. 71. BigMemory DirectByteBuffer sun.misc.Unsafe
  72. 72. ...bye bye GC...
  73. 73. bitbucket://kcrimson/hipcache Implementacja memcached na JVM, z wykorzystaniem DirectByteBuffer
  74. 74. ...infinispan...
  75. 75. ...czy to cache...
  76. 76. ...czy to „data grid”...
  77. 77. ...transakcyjny... JTA
  78. 78. ...replikowany kontra rozproszony... JGroups
  79. 79. ...rozproszony... hashOwners
  80. 80. ...persystentny... file RDBMS S3
  81. 81. …”cloud ready”...
  82. 82. …kolorowy zawrót głowy...
  83. 83. Tree API Query API Group API
  84. 84. …”HotRod server”... binary REST memcached
  85. 85. …co więc warto...
  86. 86. …database cache...
  87. 87. …Hibernate, JPA i @Cache...
  88. 88. …session level cache... hibernate.cache.provider_class
  89. 89. …second level cache... hibernate.cache.use_second_level_cache=true
  90. 90. import javax.persistence.Cacheable; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; @Entity @Table(name = "albums") @Cacheable @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Album implements Serializable { @ManyToMany @Cache(usage= CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) private Set<Artist> artists; }
  91. 91. …query cache... hibernate.cache.use_query_cache=true
  92. 92. Query query = …; query.setCacheable(true); List result = query.list();
  93. 93. …application cache...
  94. 94. if key is in cache: return value else: value = method(key) cache.put(key,value) return value
  95. 95. JSR 107 || Spring Declarative Cache
  96. 96. @Cacheable(value="books", key="isbn.rawNumber") public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) @Cacheable(value="books", condition="name.length < 32", unless="result.hardback") public Book findBook(String name)
  97. 97. …frontend cache... serwer czy klient?
  98. 98. Apache + mod_cache Ngnix Varnish Squid
  99. 99. ...a co gdy to aplikacja powinna mieć kontrolę nad cache...
  100. 100. Conditional GET
  101. 101. ETag 304 Not Modified
  102. 102. public Response getOrder(@PathParam("id") String id, @Context Request request) { Order order = orderDAO.findOne(Long.valueOf(id)); if (order == null) { return status(Status.NOT_FOUND).build(); } EntityTag etag = EntityTag.valueOf(md5Crypt(reflectionToString(order).getBytes())); ResponseBuilder preconditions = request.evaluatePreconditions(etag); if (preconditions != null) { // response has not changed return preconditions.build(); } OrdersListResponseDTO orders = new OrdersListResponseDTO(); OrderDTO orderDTO = new OrderDTO(order); orders.addOrder(orderDTO); return ok(orders).entity(etag).build(); }
  103. 103. Q&A

×