I'm totally biased here, but I agree with Simon -- You should definitely check out ERJGroupsSync ... This is an incredibly hard problem to get right, and I was only ever able to do it properly when I ultimately hooked into EODatabaseContext directly to be able to get cache change notifications. In almost any other way (I went through about 3 or 4 implementations before settling on the current one), you are bound to end up with dead locks, lost updates (like not receiving updates of the inverse relationship being updated), or really expensive change tracking. That you have that lock commented out gives me a HUGE case of the willies. I spent several weeks of development on this problem .. I would say it's the most complicated work that I've done on WO, in fact, mainly because things are so fragile at this level. One slip of a lock or a misunderstanding of calling order, and horrible things happen. I won't claim that ERJG is without bugs, but I can assure you this code sample you're showing is really scary :)

ms

On Dec 20, 2007, at 11:00 PM, Dov Rosenberg wrote:

The big problem we are facing on the change notification is the object invalidation within EOF. JMS seems capable of getting the messages where they need to be, its just we are getting NSRecursiveLocks when trying to invalidate the individual objects. We do something like the following (we only send the globalids in the JMS message):

        public void run() {
        NSMutableSet ids = IMGlobalIDsQueue.getIdsAndResetQueue();
        int count = 0;
        if (ids != null && ids.count() > 0) {
EOObjectStoreCoordinator coordinator = EOObjectStoreCoordinator.defaultCoordinator();
            //coordinator.lock();
            count = ids.count();
            try {

coordinator.invalidateObjectsWithGlobalIDs(ids.allObjects());

            } finally {
                //coordinator.unlock();
            }
        }

    }


We build up a queue of the incoming messages and process them with a timer thread with the above code. If we uncomment the coordinator.lock()/unlock() methods bad things happen very quickly. The timer is a singleton class so there should only be a single timer per application/object store coordinator. It seems the lock is happening when a new EditingContext is being created by either a session or via new EOEditingContext().

Dov Rosenberg

On 12/20/07 10:31 PM, "Simon McLean" <[EMAIL PROTECTED]> wrote:

We used the JMS stuff a while back and had similar problems. We now use ERJGroups instead and have found it to be much more scaleable, albeit a little memory hungry. I would definitely give it a shot before changing any code as it's pretty much a drop-in replacement for the JMS stuff.

Simon

On 21 Dec 2007, at 03:01, Dov Rosenberg wrote:

We have been using a JMS based change notification framework (based on the Project Wonder code) and have started to notice more deadlocks and performance problems under higher load and more servers in the network. I think we have decided that an external change notification framework is just not going to be scalable enough for our needs.

We have been throwing around various strategies but I wanted to vet them to the greater WO community for assessment. Any feedback is appreciated.

 Application Profile:
Our application is deployed as a servlet using a WAR file that gets expanded by the container (Tomcat 5.5). The app is currently built using WO 5.3 but we are in the process of converting it to WO 5.4. Our application is typically deployed in multiple tomcat instances across 1 or more machines in a network. We have an administration console, a web client (using EOF based custom JSP tag libs that we created), and a set of EOF based Apache Axis web services. The web client is primarily read only and makes extensive use of the SharedEditingContext. The web services client is basically stateless. The mgmt console is a typical WO/EOF application that uses the defaultEditingContext extensively. We have borrowed some Project Wonder components and adapted them to our needs but have not implemented the whole Project Wonder set of frameworks. Administration console users generate content that the web client and web services clients interact with.

 Option 1:
Replace the session based defaultEditingContext in the mgmt console and create a new EC each time one is needed. Perhaps using the ERXEC instead of a regular EC. This would still leave us with the SharedEditingContext to deal with in the web app. The web app needs to see fresh data when it occurs, but short of replacing the shared EC with a new EC each time and doing a lot more DB fetches I am not sure how to maintain adequate performance.

 Option 2:
Replace the standard EC and associated ObjectStoreCoordinator stuff with Project Wonder components (is there a Wonder SharedEditingContext?)

 Option 3:
Come up with another strategy to deal with multi instance data synchronization.

 Dov Rosenberg
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/simon_mclean%40mac.com

This email sent to [EMAIL PROTECTED]




_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/mschrag%40mdimension.com

This email sent to [EMAIL PROTECTED]

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to