CAS + EHCache Ticket Registry

6 messages Options
Embed this post
Permalink
Dean Heisey

CAS + EHCache Ticket Registry

Reply Threaded More More options
Print post
Permalink
After reading through the old postings and the CASUM I have not found any mention of an EHCache backed ticket registry.  I have two questions:

1) has anyone implemented one yet?
2) the Users Manual mentions terracotta and the default ticket registry.  Does that actually work and has anyone implemented it?

Dean
Scott Battaglia-2

Re: CAS + EHCache Ticket Registry

Reply Threaded More More options
Print post
Permalink
On Thu, Oct 29, 2009 at 5:11 PM, Dean Heisey <[hidden email]> wrote:

After reading through the old postings and the CASUM I have not found any
mention of an EHCache backed ticket registry.  I have two questions:

1) has anyone implemented one yet?

When we first tried it, it didn't scale very well.  We haven't tried with newer versions.
 
2) the Users Manual mentions terracotta and the default ticket registry.
Does that actually work and has anyone implemented it?

There have a been a few instances where its been deployed.  We include a sample config in SVN.

Cheers,
Scott
 

Dean
--
View this message in context: http://n4.nabble.com/CAS-EHCache-Ticket-Registry-tp278045p278045.html
Sent from the CAS Users mailing list archive at Nabble.com.

--
You are currently subscribed to [hidden email] as: [hidden email]
To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user

-- 
You are currently subscribed to [hidden email] as: [hidden email]
To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
Cyrille Le Clerc-2

Re: CAS + EHCache Ticket Registry

Reply Threaded More More options
Print post
Permalink
  Hello Dean,

  We happily use a Distributed EHCache Ticket Registry on a high
volume french portal that reaches a max of 40 ticket granting tickets
and 80 service tickets created per second. That is about 120 tickets
replicated per second.

  This EH Cache Ticket Registry has been used for more than six month
without causing major issues and the traffic is increasing. We are
very happy with EH Cache and RMI because they almost do not require
configuration and tuning. We would have been interested in Memcached
but we didn't have skills to provide 7x24 support on this technology
we don't use in-house.

For this, we have a cluster of three nodes :
* HP ProLiant G5 dual quad cores 54xx Intel Xeon.
* Red Hat Enterprise Linux 4 / 2.6.9-78.0.8.ELsmp 32 bits
* Sun jdk 1.6.0.13
* Tomcat 6.0.18
* CAS 3.3.1
* EHCache 1.6.1 with :
  ** Auto discovery of the peers
  ** RMI Synchronous Replicator for service tickets :
      service tickets validation doesn't benefit of server affinity
and can occur few ms after creation
  ** RMI Asynchronous Replicator for the ticket granting tickets :
      ticket granting ticket benefit of server affinity because they
are always accessed via the end user browser
      (no server-to-server exchanges)

  The CPU consumed by this application remain quite low and we have
deployed other high traffic web applications on these physical
servers.

  The biggest problem we faced was the saturation of the Network
Interface Cards because we didn't know but we used and 100 Mbits/s
switch (pretty surprising in 2009 ;-) ). The servers froze on RMI
socket establishment calls. Once we upgraded to a Giga Bits Ethernet
switch, everything came back to normal.

  Another point you may worry about is long
stop-the-world-garbage-collection phases on peer servers if you set
aggressive RMI read timeouts.
  We didn't feel the need to define RMI timeouts on our CAS cluster
but we use it on another application that also heavily rely on
Distributed Sync RMI EHCache and face sparse RMI timeouts that seem to
be caused by long stop-the-world-garbage collections on peer servers.

  I am no longer member of the SSO team but I am sure we can give you
the one hundred lines of code of the EHCacheTicketRegistry.

  Hope this helps,

  Cyrille

--
Cyrille Le Clerc
[hidden email] [hidden email]
http://blog.xebia.fr

On Thu, Oct 29, 2009 at 10:29 PM, Scott Battaglia
<[hidden email]> wrote:

>
> On Thu, Oct 29, 2009 at 5:11 PM, Dean Heisey <[hidden email]> wrote:
>>
>> After reading through the old postings and the CASUM I have not found any
>> mention of an EHCache backed ticket registry.  I have two questions:
>>
>> 1) has anyone implemented one yet?
>
> When we first tried it, it didn't scale very well.  We haven't tried with newer versions.
>
>>
>> 2) the Users Manual mentions terracotta and the default ticket registry.
>> Does that actually work and has anyone implemented it?
>
> There have a been a few instances where its been deployed.  We include a sample config in SVN.
>
> Cheers,
> Scott
>
>>
>> Dean
>> --
>> View this message in context: http://n4.nabble.com/CAS-EHCache-Ticket-Registry-tp278045p278045.html
>> Sent from the CAS Users mailing list archive at Nabble.com.
>>
>> --
>> You are currently subscribed to [hidden email] as: [hidden email]
>> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
>
> --
> You are currently subscribed to [hidden email] as: [hidden email]
> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user

--
You are currently subscribed to [hidden email] as: [hidden email]
To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
Dean Heisey

RE: CAS + EHCache Ticket Registry

Reply Threaded More More options
Print post
Permalink
Hi Cyrille,

   Thanks for sharing your experience.  If you can share the code that would be great, if not.  I will implement my own.

Dean

-----Original Message-----
From: Cyrille Le Clerc [mailto:[hidden email]]
Sent: Tuesday, November 03, 2009 12:56 AM
To: [hidden email]
Subject: Re: [cas-user] CAS + EHCache Ticket Registry

  Hello Dean,

  We happily use a Distributed EHCache Ticket Registry on a high
volume french portal that reaches a max of 40 ticket granting tickets
and 80 service tickets created per second. That is about 120 tickets
replicated per second.

  This EH Cache Ticket Registry has been used for more than six month
without causing major issues and the traffic is increasing. We are
very happy with EH Cache and RMI because they almost do not require
configuration and tuning. We would have been interested in Memcached
but we didn't have skills to provide 7x24 support on this technology
we don't use in-house.

For this, we have a cluster of three nodes :
* HP ProLiant G5 dual quad cores 54xx Intel Xeon.
* Red Hat Enterprise Linux 4 / 2.6.9-78.0.8.ELsmp 32 bits
* Sun jdk 1.6.0.13
* Tomcat 6.0.18
* CAS 3.3.1
* EHCache 1.6.1 with :
  ** Auto discovery of the peers
  ** RMI Synchronous Replicator for service tickets :
      service tickets validation doesn't benefit of server affinity
and can occur few ms after creation
  ** RMI Asynchronous Replicator for the ticket granting tickets :
      ticket granting ticket benefit of server affinity because they
are always accessed via the end user browser
      (no server-to-server exchanges)

  The CPU consumed by this application remain quite low and we have
deployed other high traffic web applications on these physical
servers.

  The biggest problem we faced was the saturation of the Network
Interface Cards because we didn't know but we used and 100 Mbits/s
switch (pretty surprising in 2009 ;-) ). The servers froze on RMI
socket establishment calls. Once we upgraded to a Giga Bits Ethernet
switch, everything came back to normal.

  Another point you may worry about is long
stop-the-world-garbage-collection phases on peer servers if you set
aggressive RMI read timeouts.
  We didn't feel the need to define RMI timeouts on our CAS cluster
but we use it on another application that also heavily rely on
Distributed Sync RMI EHCache and face sparse RMI timeouts that seem to
be caused by long stop-the-world-garbage collections on peer servers.

  I am no longer member of the SSO team but I am sure we can give you
the one hundred lines of code of the EHCacheTicketRegistry.

  Hope this helps,

  Cyrille

--
Cyrille Le Clerc
[hidden email] [hidden email]
http://blog.xebia.fr

On Thu, Oct 29, 2009 at 10:29 PM, Scott Battaglia
<[hidden email]> wrote:

>
> On Thu, Oct 29, 2009 at 5:11 PM, Dean Heisey <[hidden email]> wrote:
>>
>> After reading through the old postings and the CASUM I have not found any
>> mention of an EHCache backed ticket registry.  I have two questions:
>>
>> 1) has anyone implemented one yet?
>
> When we first tried it, it didn't scale very well.  We haven't tried with newer versions.
>
>>
>> 2) the Users Manual mentions terracotta and the default ticket registry.
>> Does that actually work and has anyone implemented it?
>
> There have a been a few instances where its been deployed.  We include a sample config in SVN.
>
> Cheers,
> Scott
>
>>
>> Dean
>> --
>> View this message in context: http://n4.nabble.com/CAS-EHCache-Ticket-Registry-tp278045p278045.html
>> Sent from the CAS Users mailing list archive at Nabble.com.
>>
>> --
>> You are currently subscribed to [hidden email] as: [hidden email]
>> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
>
> --
> You are currently subscribed to [hidden email] as: [hidden email]
> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user

--
You are currently subscribed to [hidden email] as: [hidden email]
To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user

--
You are currently subscribed to [hidden email] as: [hidden email]
To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user

Cyrille Le Clerc-2

Re: CAS + EHCache Ticket Registry

Reply Threaded More More options
Print post
Permalink
Hello Dean,

Sorry for the delay. Here is the EhCacheTicketRegistry.java with a
JA-SIG Licence. I send it both as an attachment and doing a copy-paste
in the email body in case the mailing mist would reject attachments.

Hope this helps,

Cyrille


/*
 * Copyright 2007 The JA-SIG Collaborative. All rights reserved. See license
 * distributed with this file and available online at
 * http://www.uportal.org/license.html
 */
 package org.jasig.cas.ticket.registry.ehcache;

import java.util.Collection;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.inspektr.common.ioc.annotation.NotNull;
import org.jasig.cas.ticket.ServiceTicket;
import org.jasig.cas.ticket.Ticket;
import org.jasig.cas.ticket.TicketGrantingTicket;
import org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry;
import org.jasig.cas.ticket.registry.TicketRegistry;
import org.springframework.core.style.ToStringCreator;

/**
 * <p>
 * <a href="http://ehcache.sourceforge.net/">EHCache</a> based
distributed ticket registry.
 * </p>
 * <p>
 * Use distinct caches for ticket granting tickets (TGT) and service
tickets (ST) for:
 * <ul>
 * <li>Tuning : use cache level time to live with different values for
TGT an ST.</li>
 * <li>Tuning : have different replication strategies for TGT and ST
(ST should be synchronized more quickly).</li>
 * <li>Monitoring : follow separately the number of TGT and ST.</li>
 * <ul>
 * </p>
 *
 * @author <a href="mailto:[hidden email]">Cyrille Le Clerc</a>
 */
public class EhCacheTicketRegistry extends
AbstractDistributedTicketRegistry implements TicketRegistry {

    @NotNull
    protected Cache serviceTicketsCache;

    @NotNull
    protected Cache ticketGrantingTicketsCache;

    @Override
    public void addTicket(Ticket ticket) {
        Element element = new Element(ticket.getId(), ticket);
        if (ticket instanceof ServiceTicket) {
            serviceTicketsCache.put(element);
        } else if (ticket instanceof TicketGrantingTicket) {
            ticketGrantingTicketsCache.put(element);
        } else {
            throw new IllegalArgumentException("Invalid ticket type " + ticket);
        }
    }

    @Override
    public boolean deleteTicket(String ticketId) {
        boolean result;
        if (ticketId.startsWith(TicketGrantingTicket.PREFIX)) {
            result = ticketGrantingTicketsCache.remove(ticketId);
        } else if (ticketId.startsWith(ServiceTicket.PREFIX)) {
            result = serviceTicketsCache.remove(ticketId);
        } else {
            result = false;
            if (log.isInfoEnabled()) {
                log.info("Unsupported ticket prefix for ticketId '" +
ticketId + "', return " + result);
            }
        }
        return result;
    }

    @Override
    public Ticket getTicket(String ticketId) {
        Element element;
        if (ticketId.startsWith(TicketGrantingTicket.PREFIX)) {
            element = ticketGrantingTicketsCache.get(ticketId);
        } else if (ticketId.startsWith(ServiceTicket.PREFIX)) {
            element = serviceTicketsCache.get(ticketId);
        } else {
            element = null;
            if (log.isInfoEnabled()) {
                log.info("Unsupported ticket prefix for ticketId '" +
ticketId + "', return " + element);
            }
        }
        return element == null ? null :
getProxiedTicketInstance((Ticket)element.getValue());
    }

    @Override
    public Collection<Ticket> getTickets() {
        throw new UnsupportedOperationException("GetTickets not supported.");
    }

    public void setServiceTicketsCache(Cache serviceTicketsCache) {
        this.serviceTicketsCache = serviceTicketsCache;
    }

    public void setTicketGrantingTicketsCache(Cache
ticketGrantingTicketsCache) {
        this.ticketGrantingTicketsCache = ticketGrantingTicketsCache;
    }

    @Override
    public String toString() {
        return new
ToStringCreator(this).append("ticketGrantingTicketsCache",
this.ticketGrantingTicketsCache)
            .append("serviceTicketsCache", this.serviceTicketsCache).toString();
    }

    @Override
    protected void updateTicket(Ticket ticket) {
        addTicket(ticket);
    }
}

On Tue, Nov 3, 2009 at 9:52 PM, Dean Heisey <[hidden email]> wrote:

>
> Hi Cyrille,
>
>   Thanks for sharing your experience.  If you can share the code that would be great, if not.  I will implement my own.
>
> Dean
>
> -----Original Message-----
> From: Cyrille Le Clerc [mailto:[hidden email]]
> Sent: Tuesday, November 03, 2009 12:56 AM
> To: [hidden email]
> Subject: Re: [cas-user] CAS + EHCache Ticket Registry
>
>  Hello Dean,
>
>  We happily use a Distributed EHCache Ticket Registry on a high
> volume french portal that reaches a max of 40 ticket granting tickets
> and 80 service tickets created per second. That is about 120 tickets
> replicated per second.
>
>  This EH Cache Ticket Registry has been used for more than six month
> without causing major issues and the traffic is increasing. We are
> very happy with EH Cache and RMI because they almost do not require
> configuration and tuning. We would have been interested in Memcached
> but we didn't have skills to provide 7x24 support on this technology
> we don't use in-house.
>
> For this, we have a cluster of three nodes :
> * HP ProLiant G5 dual quad cores 54xx Intel Xeon.
> * Red Hat Enterprise Linux 4 / 2.6.9-78.0.8.ELsmp 32 bits
> * Sun jdk 1.6.0.13
> * Tomcat 6.0.18
> * CAS 3.3.1
> * EHCache 1.6.1 with :
>  ** Auto discovery of the peers
>  ** RMI Synchronous Replicator for service tickets :
>      service tickets validation doesn't benefit of server affinity
> and can occur few ms after creation
>  ** RMI Asynchronous Replicator for the ticket granting tickets :
>      ticket granting ticket benefit of server affinity because they
> are always accessed via the end user browser
>      (no server-to-server exchanges)
>
>  The CPU consumed by this application remain quite low and we have
> deployed other high traffic web applications on these physical
> servers.
>
>  The biggest problem we faced was the saturation of the Network
> Interface Cards because we didn't know but we used and 100 Mbits/s
> switch (pretty surprising in 2009 ;-) ). The servers froze on RMI
> socket establishment calls. Once we upgraded to a Giga Bits Ethernet
> switch, everything came back to normal.
>
>  Another point you may worry about is long
> stop-the-world-garbage-collection phases on peer servers if you set
> aggressive RMI read timeouts.
>  We didn't feel the need to define RMI timeouts on our CAS cluster
> but we use it on another application that also heavily rely on
> Distributed Sync RMI EHCache and face sparse RMI timeouts that seem to
> be caused by long stop-the-world-garbage collections on peer servers.
>
>  I am no longer member of the SSO team but I am sure we can give you
> the one hundred lines of code of the EHCacheTicketRegistry.
>
>  Hope this helps,
>
>  Cyrille
>
> --
> Cyrille Le Clerc
> [hidden email] [hidden email]
> http://blog.xebia.fr
>
> On Thu, Oct 29, 2009 at 10:29 PM, Scott Battaglia
> <[hidden email]> wrote:
> >
> > On Thu, Oct 29, 2009 at 5:11 PM, Dean Heisey <[hidden email]> wrote:
> >>
> >> After reading through the old postings and the CASUM I have not found any
> >> mention of an EHCache backed ticket registry.  I have two questions:
> >>
> >> 1) has anyone implemented one yet?
> >
> > When we first tried it, it didn't scale very well.  We haven't tried with newer versions.
> >
> >>
> >> 2) the Users Manual mentions terracotta and the default ticket registry.
> >> Does that actually work and has anyone implemented it?
> >
> > There have a been a few instances where its been deployed.  We include a sample config in SVN.
> >
> > Cheers,
> > Scott
> >
> >>
> >> Dean
> >> --
> >> View this message in context: http://n4.nabble.com/CAS-EHCache-Ticket-Registry-tp278045p278045.html
> >> Sent from the CAS Users mailing list archive at Nabble.com.
> >>
> >> --
> >> You are currently subscribed to [hidden email] as: [hidden email]
> >> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
> >
> > --
> > You are currently subscribed to [hidden email] as: [hidden email]
> > To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
>
> --
> You are currently subscribed to [hidden email] as: [hidden email]
> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
>
> --
> You are currently subscribed to [hidden email] as: [hidden email]
> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
>
--
You are currently subscribed to [hidden email] as: [hidden email]
To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
/*
 * Copyright 2007 The JA-SIG Collaborative. All rights reserved. See license
 * distributed with this file and available online at
 * http://www.uportal.org/license.html
 */
 package org.jasig.cas.ticket.registry.ehcache;

import java.util.Collection;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.inspektr.common.ioc.annotation.NotNull;
import org.jasig.cas.ticket.ServiceTicket;
import org.jasig.cas.ticket.Ticket;
import org.jasig.cas.ticket.TicketGrantingTicket;
import org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry;
import org.jasig.cas.ticket.registry.TicketRegistry;
import org.springframework.core.style.ToStringCreator;

/**
 * <p>
 * <a href="http://ehcache.sourceforge.net/">EHCache</a> based distributed ticket registry.
 * </p>
 * <p>
 * Use distinct caches for ticket granting tickets (TGT) and service tickets (ST) for:
 * <ul>
 * <li>Tuning : use cache level time to live with different values for TGT an ST.</li>
 * <li>Tuning : have different replication strategies for TGT and ST (ST should be synchronized more quickly).</li>
 * <li>Monitoring : follow separately the number of TGT and ST.</li>
 * <ul>
 * </p>
 *
 * @author <a href="mailto:[hidden email]">Cyrille Le Clerc</a>
 */
public class EhCacheTicketRegistry extends AbstractDistributedTicketRegistry implements TicketRegistry {
   
    @NotNull
    protected Cache serviceTicketsCache;
   
    @NotNull
    protected Cache ticketGrantingTicketsCache;
   
    @Override
    public void addTicket(Ticket ticket) {
        Element element = new Element(ticket.getId(), ticket);
        if (ticket instanceof ServiceTicket) {
            serviceTicketsCache.put(element);
        } else if (ticket instanceof TicketGrantingTicket) {
            ticketGrantingTicketsCache.put(element);
        } else {
            throw new IllegalArgumentException("Invalid ticket type " + ticket);
        }
    }
   
    @Override
    public boolean deleteTicket(String ticketId) {
        boolean result;
        if (ticketId.startsWith(TicketGrantingTicket.PREFIX)) {
            result = ticketGrantingTicketsCache.remove(ticketId);
        } else if (ticketId.startsWith(ServiceTicket.PREFIX)) {
            result = serviceTicketsCache.remove(ticketId);
        } else {
            result = false;
            if (log.isInfoEnabled()) {
                log.info("Unsupported ticket prefix for ticketId '" + ticketId + "', return " + result);
            }
        }
        return result;
    }
   
    @Override
    public Ticket getTicket(String ticketId) {
        Element element;
        if (ticketId.startsWith(TicketGrantingTicket.PREFIX)) {
            element = ticketGrantingTicketsCache.get(ticketId);
        } else if (ticketId.startsWith(ServiceTicket.PREFIX)) {
            element = serviceTicketsCache.get(ticketId);
        } else {
            element = null;
            if (log.isInfoEnabled()) {
                log.info("Unsupported ticket prefix for ticketId '" + ticketId + "', return " + element);
            }
        }
        return element == null ? null : getProxiedTicketInstance((Ticket)element.getValue());
    }
   
    @Override
    public Collection<Ticket> getTickets() {
        throw new UnsupportedOperationException("GetTickets not supported.");
    }
   
    public void setServiceTicketsCache(Cache serviceTicketsCache) {
        this.serviceTicketsCache = serviceTicketsCache;
    }
   
    public void setTicketGrantingTicketsCache(Cache ticketGrantingTicketsCache) {
        this.ticketGrantingTicketsCache = ticketGrantingTicketsCache;
    }
   
    @Override
    public String toString() {
        return new ToStringCreator(this).append("ticketGrantingTicketsCache", this.ticketGrantingTicketsCache)
            .append("serviceTicketsCache", this.serviceTicketsCache).toString();
    }
   
    @Override
    protected void updateTicket(Ticket ticket) {
        addTicket(ticket);
    }
}
Dean Heisey

RE: CAS + EHCache Ticket Registry

Reply Threaded More More options
Print post
Permalink
Thanks Cyrrile,

  I got pulled into another project and am just getting back to this.

Dean

-----Original Message-----
From: Cyrille Le Clerc [mailto:[hidden email]]
Sent: Sunday, November 08, 2009 10:21 AM
To: [hidden email]
Subject: Re: [cas-user] CAS + EHCache Ticket Registry

Hello Dean,

Sorry for the delay. Here is the EhCacheTicketRegistry.java with a
JA-SIG Licence. I send it both as an attachment and doing a copy-paste
in the email body in case the mailing mist would reject attachments.

Hope this helps,

Cyrille


/*
 * Copyright 2007 The JA-SIG Collaborative. All rights reserved. See license
 * distributed with this file and available online at
 * http://www.uportal.org/license.html
 */
 package org.jasig.cas.ticket.registry.ehcache;

import java.util.Collection;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.inspektr.common.ioc.annotation.NotNull;
import org.jasig.cas.ticket.ServiceTicket;
import org.jasig.cas.ticket.Ticket;
import org.jasig.cas.ticket.TicketGrantingTicket;
import org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry;
import org.jasig.cas.ticket.registry.TicketRegistry;
import org.springframework.core.style.ToStringCreator;

/**
 * <p>
 * <a href="http://ehcache.sourceforge.net/">EHCache</a> based
distributed ticket registry.
 * </p>
 * <p>
 * Use distinct caches for ticket granting tickets (TGT) and service
tickets (ST) for:
 * <ul>
 * <li>Tuning : use cache level time to live with different values for
TGT an ST.</li>
 * <li>Tuning : have different replication strategies for TGT and ST
(ST should be synchronized more quickly).</li>
 * <li>Monitoring : follow separately the number of TGT and ST.</li>
 * <ul>
 * </p>
 *
 * @author <a href="mailto:[hidden email]">Cyrille Le Clerc</a>
 */
public class EhCacheTicketRegistry extends
AbstractDistributedTicketRegistry implements TicketRegistry {

    @NotNull
    protected Cache serviceTicketsCache;

    @NotNull
    protected Cache ticketGrantingTicketsCache;

    @Override
    public void addTicket(Ticket ticket) {
        Element element = new Element(ticket.getId(), ticket);
        if (ticket instanceof ServiceTicket) {
            serviceTicketsCache.put(element);
        } else if (ticket instanceof TicketGrantingTicket) {
            ticketGrantingTicketsCache.put(element);
        } else {
            throw new IllegalArgumentException("Invalid ticket type " + ticket);
        }
    }

    @Override
    public boolean deleteTicket(String ticketId) {
        boolean result;
        if (ticketId.startsWith(TicketGrantingTicket.PREFIX)) {
            result = ticketGrantingTicketsCache.remove(ticketId);
        } else if (ticketId.startsWith(ServiceTicket.PREFIX)) {
            result = serviceTicketsCache.remove(ticketId);
        } else {
            result = false;
            if (log.isInfoEnabled()) {
                log.info("Unsupported ticket prefix for ticketId '" +
ticketId + "', return " + result);
            }
        }
        return result;
    }

    @Override
    public Ticket getTicket(String ticketId) {
        Element element;
        if (ticketId.startsWith(TicketGrantingTicket.PREFIX)) {
            element = ticketGrantingTicketsCache.get(ticketId);
        } else if (ticketId.startsWith(ServiceTicket.PREFIX)) {
            element = serviceTicketsCache.get(ticketId);
        } else {
            element = null;
            if (log.isInfoEnabled()) {
                log.info("Unsupported ticket prefix for ticketId '" +
ticketId + "', return " + element);
            }
        }
        return element == null ? null :
getProxiedTicketInstance((Ticket)element.getValue());
    }

    @Override
    public Collection<Ticket> getTickets() {
        throw new UnsupportedOperationException("GetTickets not supported.");
    }

    public void setServiceTicketsCache(Cache serviceTicketsCache) {
        this.serviceTicketsCache = serviceTicketsCache;
    }

    public void setTicketGrantingTicketsCache(Cache
ticketGrantingTicketsCache) {
        this.ticketGrantingTicketsCache = ticketGrantingTicketsCache;
    }

    @Override
    public String toString() {
        return new
ToStringCreator(this).append("ticketGrantingTicketsCache",
this.ticketGrantingTicketsCache)
            .append("serviceTicketsCache", this.serviceTicketsCache).toString();
    }

    @Override
    protected void updateTicket(Ticket ticket) {
        addTicket(ticket);
    }
}

On Tue, Nov 3, 2009 at 9:52 PM, Dean Heisey <[hidden email]> wrote:

>
> Hi Cyrille,
>
>   Thanks for sharing your experience.  If you can share the code that would be great, if not.  I will implement my own.
>
> Dean
>
> -----Original Message-----
> From: Cyrille Le Clerc [mailto:[hidden email]]
> Sent: Tuesday, November 03, 2009 12:56 AM
> To: [hidden email]
> Subject: Re: [cas-user] CAS + EHCache Ticket Registry
>
>  Hello Dean,
>
>  We happily use a Distributed EHCache Ticket Registry on a high
> volume french portal that reaches a max of 40 ticket granting tickets
> and 80 service tickets created per second. That is about 120 tickets
> replicated per second.
>
>  This EH Cache Ticket Registry has been used for more than six month
> without causing major issues and the traffic is increasing. We are
> very happy with EH Cache and RMI because they almost do not require
> configuration and tuning. We would have been interested in Memcached
> but we didn't have skills to provide 7x24 support on this technology
> we don't use in-house.
>
> For this, we have a cluster of three nodes :
> * HP ProLiant G5 dual quad cores 54xx Intel Xeon.
> * Red Hat Enterprise Linux 4 / 2.6.9-78.0.8.ELsmp 32 bits
> * Sun jdk 1.6.0.13
> * Tomcat 6.0.18
> * CAS 3.3.1
> * EHCache 1.6.1 with :
>  ** Auto discovery of the peers
>  ** RMI Synchronous Replicator for service tickets :
>      service tickets validation doesn't benefit of server affinity
> and can occur few ms after creation
>  ** RMI Asynchronous Replicator for the ticket granting tickets :
>      ticket granting ticket benefit of server affinity because they
> are always accessed via the end user browser
>      (no server-to-server exchanges)
>
>  The CPU consumed by this application remain quite low and we have
> deployed other high traffic web applications on these physical
> servers.
>
>  The biggest problem we faced was the saturation of the Network
> Interface Cards because we didn't know but we used and 100 Mbits/s
> switch (pretty surprising in 2009 ;-) ). The servers froze on RMI
> socket establishment calls. Once we upgraded to a Giga Bits Ethernet
> switch, everything came back to normal.
>
>  Another point you may worry about is long
> stop-the-world-garbage-collection phases on peer servers if you set
> aggressive RMI read timeouts.
>  We didn't feel the need to define RMI timeouts on our CAS cluster
> but we use it on another application that also heavily rely on
> Distributed Sync RMI EHCache and face sparse RMI timeouts that seem to
> be caused by long stop-the-world-garbage collections on peer servers.
>
>  I am no longer member of the SSO team but I am sure we can give you
> the one hundred lines of code of the EHCacheTicketRegistry.
>
>  Hope this helps,
>
>  Cyrille
>
> --
> Cyrille Le Clerc
> [hidden email] [hidden email]
> http://blog.xebia.fr
>
> On Thu, Oct 29, 2009 at 10:29 PM, Scott Battaglia
> <[hidden email]> wrote:
> >
> > On Thu, Oct 29, 2009 at 5:11 PM, Dean Heisey <[hidden email]> wrote:
> >>
> >> After reading through the old postings and the CASUM I have not found any
> >> mention of an EHCache backed ticket registry.  I have two questions:
> >>
> >> 1) has anyone implemented one yet?
> >
> > When we first tried it, it didn't scale very well.  We haven't tried with newer versions.
> >
> >>
> >> 2) the Users Manual mentions terracotta and the default ticket registry.
> >> Does that actually work and has anyone implemented it?
> >
> > There have a been a few instances where its been deployed.  We include a sample config in SVN.
> >
> > Cheers,
> > Scott
> >
> >>
> >> Dean
> >> --
> >> View this message in context: http://n4.nabble.com/CAS-EHCache-Ticket-Registry-tp278045p278045.html
> >> Sent from the CAS Users mailing list archive at Nabble.com.
> >>
> >> --
> >> You are currently subscribed to [hidden email] as: [hidden email]
> >> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
> >
> > --
> > You are currently subscribed to [hidden email] as: [hidden email]
> > To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
>
> --
> You are currently subscribed to [hidden email] as: [hidden email]
> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
>
> --
> You are currently subscribed to [hidden email] as: [hidden email]
> To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
>

--
You are currently subscribed to [hidden email] as: [hidden email]
To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user

--
You are currently subscribed to [hidden email] as: [hidden email]
To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user