The document discusses Varnish Cache and its usage for caching content and improving performance in Magento. It describes how Varnish works as a frontend caching proxy and how it can be used to cache pages and parts of pages in Magento. It also discusses how to make cache dynamic and flush pages based on products or categories using the EcomDev_Varnish module.
Иван Чепурный - Meet Magento Ukraine - Varnish Cache and its usage in the real world
1. Varnish Cache
and its usage in the real world
Ivan Chepurnyi
CTO
Interactiv4
2. About me
Ivan Chepurnyi
Meet Magento
• Technical Consultant, Owner at EcomDev B.V.
• Started as one of the first five developers in original Magento
core team
• Magento Developer Coach in Europe
• Main areas of my expertise:
– System Architecture
– Performance Optimization
– Test Driven Development
– Complex Customizations
3. Varnish
is not a cache backend
Ivan Chepurnyi Meet Magento
4. Varnish
is a frontend caching proxy
Ivan Chepurnyi Meet Magento
7. How Varnish Works
hash pipe
fetch
Ivan Chepurnyi
Meet Magento
recv
hit miss pass
deliver
• recv – request is received from client
• pipe – direct output of backend data
(streaming)
• hash – request is cacheable, lookup
cache entry
• pass – request is not cacheable
• hit – cache entry is found
• miss – cache entry not found
• fetch – retrieval of data from
backend
• deliver – return data to client
8. What can we do with it?
• Cache static pages (Homepage, CMS, Contacts, etc)
Ivan Chepurnyi
Meet Magento
• Cache catalog pages:
– Category listings
– Product search results
– Product view pages
• Cache page parts:
– CMS Blocks
– Header
– Footer
9. Is it possible to clear Varnish
cache based on product, category,
store, etc?
YES!!!
Ivan Chepurnyi Meet Magento
10. The Secret is in
Cache Object structure
Ivan Chepurnyi Meet Magento
11. Cached Object in Varnish
Ivan Chepurnyi
Meet Magento
Cached Object
Response Headers
Response Body
Cache Metadata
Cache Content
12. We just going to supply object ID with
its type in response headers, so it later
on can be used to flush pages
containing our object.
Ivan Chepurnyi Meet Magento
13. But is it possible to make cache lifetime
dynamic per product, category, etc?
YES!!!
Ivan Chepurnyi Meet Magento
14. You can supply a response header,
that contains a TTL of the page.
Ivan Chepurnyi Meet Magento
15. So what should be done to implement
Varnish in Magento with all the
benefits?
Ivan Chepurnyi Meet Magento
16. Varnish in Magento
• Collect current page objects, that are shown on the page.
Ivan Chepurnyi
Meet Magento
Also add them into response headers.
• Create a connector to a Varnish admin protocol, that will be
used for flushing of the page by object ids.
• Implement auto-updated AJAX blocks for:
– Shopping cart
– Wishlist
– Customer Account links
17. But I have good news:
I alredy developed a module that gives you
a solid foundation for using Varnish in your
project!
Ivan Chepurnyi Meet Magento
18. EcomDev_Varnish
Ivan Chepurnyi
Meet Magento
Download URL: http://bit.ly/ecomdev_varnish
Requires:
• Varnish 3.0
• Minimal changes to your theme
Supports:
• Flush of cache on update of product, category, cms page,
csm block, price rules
• Client side cacheable AJAX placeholders (Cart, Wishlist, etc)
• Possibility to make a cache based on customer segment
• Cache for logged in users
19. Before you start using it…
Ivan Chepurnyi
Meet Magento
• Make a list of dynamic blocks in your project:
– Shopping Cart
– Login blocks
– Special Promo for Customer
• Validate possible visitor segments of your project:
– Customer group
– Language / Country
• Make a list of themes you need to modify
20. Making an element dynamic on varnish
cached page
Ivan Chepurnyi Meet Magento
21. Code Sample Dynamic Block
Layout File
Ivan Chepurnyi
Meet Magento
<default_varnish>
<reference name=”parentBlock”>
<action method="unsetChild”>
<block>dynamicBlockAlias</block>
</action>
<block
as="dynamicBlockAlias”
name=”dynamicBlockPlaceholder"
template="ecomdev/varnish/wrapper/placeholder.phtml"
type="core/template">
<action method="append">
<block>dynamicBlock</block>
</action>
<action method="setBlockName">
<block>dynamicBlock</block>
</action>
<action method="setCookie">
<cookie>dynamicCookie</cookie>
</action>
<action method="setWrapperId">
<htmlId>elementId</htmlId>
</action>
</block>
</reference>
</default_varnish>
• parentBlock – name of the parent
block
• dynamicBlockAlias – alias of the
dynamic block in parent block
• dynamicBlockPlaceholder – unique
name of your placeholder
• dynamicBlock – name of the original
dynamic block
• dynamicCookie – name of the cookie
for dynamic blocks
• elementId – HTML ID for the
placeholder div, that is going to be
used as container
22. Available Dynamic Cookies
• quote_checksum – checksum of the current quote contents
• customer_checksum – checksum based on the customer
Ivan Chepurnyi
Meet Magento
identification, if logged in customer gets changed
• is_logged_in – boolean flag of the logged in state of the
visitor
• segment_checksum – checksum of the current customer
segment:
– customer group id
– store view
23. How does it work?
• Your original block gets wrapped by a custom div with some
Ivan Chepurnyi
Meet Magento
JS code
• When customer visits a page, JS checks for a cookie value
and compares it with latest saved one in local/session
storage
• If it is different it requests /varnish/ajax/reload for retrieving
dynamic content and saves it to local/session storage
• If it is the same, it just updates block from local/session
storage
25. Code Sample Custom TTL
Code Block
Ivan Chepurnyi
Meet Magento
// Somewhere in your code you just simply call it
// Varnish module will take the lowest value in array of TTL that were added
Mage::helper(‘ecomdev_varnish’)
->addTtl($timeInSeconds);
27. Code Sample Custom Page
config.xml
Ivan Chepurnyi
Meet Magento
<config>
<varnish>
<pages>
<layout_handle_name
translate="label"
module=”your_module">
<label>Your Page Name</label>
</layout_handle_name>
</pages>
</varnish>
<default>
<varnish>
<pages>
<layout_handle_name_time>360</layout_handle_name_
time>
</pages>
</varnish>
</default>
</config>
• layout_handle_name – full
name of the layout handle that
should be cacheable
• your_module – name of the
module used for translation of
label
• Your Page Name – name of
your pages, that will be shown
in System Configuration -
Varnish Cache
• 360 – default cache lifetime of
the page
28. Varnish vs Full Page Cache
Ivan Chepurnyi
Meet Magento
Varnish
• Avg. time to first byte 30ms
• Dedicated software
• Tools to monitor cache usage
• Scalable
• Requires adaptation of themes for
dynamic parts
• Possibility to flush group of pages
Magento FPC implementation
• Avg. time to first byte 300-400ms
• Magento code level
• N/A
• Only as another backend node
• Most of the time it is not required
• N/A
29. But why do I need to use
EcomDev_Varnish?
Ivan Chepurnyi Meet Magento
30. EcomDev_Varnish vs the others
• Cache lifetime specified on Magento code level, without
Ivan Chepurnyi
Meet Magento
changing VCL
• By using collectors & processors, it can be easily extended
to support additional entities
• Client-side cacheable dynamic parts
• Cache enabled for all kind of visitors
• Saves your money on hardware
31. The choice is up to you!
Ivan Chepurnyi Meet Magento
32. We are hiring!!! Join Us
join@interactiv4.com
Ivan Chepurnyi Meet Magento