Thanks for the JIRA issue and the kind words about CAS ;-) Cheers, Scott
On Wed, Nov 25, 2009 at 7:25 PM, Cyrille Le Clerc < [email protected]> wrote: > 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 > > -- 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
