Varnish Cache and its usage in the real world!

Post on 17-Dec-2014

2.073 views 1 download

description

Varnish Cache and its usage in the real world! - Magento implementation guide.

Transcript of Varnish Cache and its usage in the real world!

Varnish Cache and its usage in the real world

Ivan ChepurnyiOwner

EcomDev BV

Ivan Chepurnyi Meet Magento

About me

• 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

Ivan Chepurnyi Meet Magento

Varnish

is not a cache backend

Ivan Chepurnyi Meet Magento

Varnish

is a frontend caching proxy

Ivan Chepurnyi Meet Magento

Simple Workflow

First call to a page

Ivan Chepurnyi Meet Magento

Simple Workflow

Subsequent requests

Ivan Chepurnyi Meet Magento

How Varnish Works

recv

hit pass miss

hash pipe

deliver

fetch

• 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

Ivan Chepurnyi Meet Magento

What can we do with it?

• Cache static pages (Homepage, CMS, Contacts, etc)

• Cache catalog pages:– Category listings– Product search results– Product view pages

• Cache page parts:– CMS Blocks– Header– Footer

Ivan Chepurnyi Meet Magento

Is it possible to clear Varnish cache based on product, category,

store, etc?

YES!!!

Ivan Chepurnyi Meet Magento

The Secret is in

Cache Object structure

Ivan Chepurnyi Meet Magento

Cached Object in Varnish

Cached Object

Response Headers

Response Body

Cache Metadata

Cache Content

Ivan Chepurnyi Meet Magento

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

But is it possible to make cache lifetime dynamic per product, category, etc?

YES!!!

Ivan Chepurnyi Meet Magento

You can supply a response header, that contains a TTL of the page.

Ivan Chepurnyi Meet Magento

So what should be done to implement Varnish in Magento with all the

benefits?

Ivan Chepurnyi Meet Magento

Varnish in Magento

• Collect current page objects, that are shown on the page. 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

Ivan Chepurnyi Meet Magento

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

EcomDev_Varnish

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

Ivan Chepurnyi Meet Magento

Before you start using it…

• 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

Ivan Chepurnyi Meet Magento

Making an element dynamic on varnish cached page

Ivan Chepurnyi Meet Magento

Code Sample Dynamic Block

<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>

Layout File • 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

Ivan Chepurnyi Meet Magento

Available Dynamic Cookies

• quote_checksum – checksum of the current quote contents

• customer_checksum – checksum based on the customer 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

Ivan Chepurnyi Meet Magento

How does it work?

• Your original block gets wrapped by a custom div with some 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

Ivan Chepurnyi Meet Magento

Adding custom TTL for a page

Ivan Chepurnyi Meet Magento

Code Sample Custom TTL

// 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);

Code Block

Ivan Chepurnyi Meet Magento

Making custom page cacheable

Ivan Chepurnyi Meet Magento

Code Sample Custom Page

<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>

config.xml• 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

Ivan Chepurnyi Meet Magento

Varnish vs Full Page Cache

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

Ivan Chepurnyi Meet Magento

But why do I need to use EcomDev_Varnish?

Ivan Chepurnyi Meet Magento

EcomDev_Varnish vs the others

• Cache lifetime specified on Magento code level, without 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

Ivan Chepurnyi Meet Magento

The choice is up to you!

Ivan Chepurnyi Meet Magento

OpenSource Roadmap 2014

1. Finalize EcomDev_Varnish module and make it open source;

2. EcomDev_PHPUnit refactoring for API based fixtures;Progress: 20%

3. Working on EcomDev_Index module, to provide alternative of standard indexation mechanism in Magento:– Flat Indexers (failover indexation)– UrlRewrites (full refactor of existing module)– Layered Navigation (Sphinx)– Better Search (Sphinx)

Ivan Chepurnyi Meet Magento

Thank You!

Questions?

Email: ivan@ecomdev.org

Website: http://www.ecomdev.org

LinkedIn: http://nl.linkedin.com/in/ivanchepurnyi

Twitter: https://twitter.com/IvanChepurnyi