Hello Scott, This is done, it is "CAS-816 - Proposal : EH Cache based distributed TicketRegistry".
Once again, thank you very much for the simplicity, the extensibility and the robustness of CAS. I had 18 months of pleasure using it on a high volume web portal. I currently work on another subject but it is a very nice souvenir :-) Cyrille -- Cyrille Le Clerc [email protected] http://blog.xebia.fr On Tue, Nov 24, 2009 at 4:19 AM, Scott Battaglia <[email protected]> wrote: > > Any chance you'd be interested in putting this in a JIRA issue? ;-) > > Cheers, > Scott > > > On Sun, Nov 8, 2009 at 1:21 PM, Cyrille Le Clerc <[email protected]> wrote: >> >> 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:[email protected]">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 <[email protected]> >> 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:[email protected]] >> > Sent: Tuesday, November 03, 2009 12:56 AM >> > To: [email protected] >> > 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 >> > [email protected] [email protected] >> > http://blog.xebia.fr >> > >> > On Thu, Oct 29, 2009 at 10:29 PM, Scott Battaglia >> > <[email protected]> wrote: >> > > >> > > On Thu, Oct 29, 2009 at 5:11 PM, Dean Heisey <[email protected]> >> > > 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 [email protected] as: >> > >> [email protected] >> > >> To unsubscribe, change settings or access archives, see >> > >> http://www.ja-sig.org/wiki/display/JSG/cas-user >> > > >> > > -- >> > > You are currently subscribed to [email protected] as: >> > > [email protected] >> > > To unsubscribe, change settings or access archives, see >> > > http://www.ja-sig.org/wiki/display/JSG/cas-user >> > >> > -- >> > You are currently subscribed to [email protected] as: >> > [email protected] >> > To unsubscribe, change settings or access archives, see >> > http://www.ja-sig.org/wiki/display/JSG/cas-user >> > >> > -- >> > You are currently subscribed to [email protected] as: >> > [email protected] >> > To unsubscribe, change settings or access archives, see >> > http://www.ja-sig.org/wiki/display/JSG/cas-user >> > >> >> -- >> You are currently subscribed to [email protected] as: >> [email protected] >> To unsubscribe, change settings or access archives, see >> http://www.ja-sig.org/wiki/display/JSG/cas-user > > -- > You are currently subscribed to [email protected] as: > [email protected] > To unsubscribe, change settings or access archives, see > http://www.ja-sig.org/wiki/display/JSG/cas-user -- You are currently subscribed to [email protected] as: [email protected] To unsubscribe, change settings or access archives, see http://www.ja-sig.org/wiki/display/JSG/cas-user
