Why does this that mean "a lot of additional work for developers"; the system would maintain the mapping transparently?
There would be a requirement for _whoever_ was implementing the mapping to do a lot more work than they would otherwise have to
Though yes, I would hope that the "system" would handle it automatically.
The point is that you are using a unique identifier anyway, so why _not_ use a UUID ? It's not like storage is a huge issue here, and it's only 16 bytes anyway.
Storage is an issue, but not the only one. The additional overhead added to each object is not the main concern; of greater concern would be the increase from 6 to 16 bytes in every object-reference, which would impose a significant impact on object collections in storage and performance.
True.
This is probably the best objection to incorporating UUIDs I've seen so far.
Personally, I'd dismiss the disk storage issue, storage is cheap and plentiful and anyone who quibbles over another gigabyte of storage is wasting time and money, but the in-memory requirements for a large collection would be a serious issue.
Still, for a non-external key collection, you're still looking at being able to store
a million object collection inside 20-25Mb. Ten million in 250Mb, just throw a 4Gb Compaq server at it. Compared to the JADE licensing cost, that's nothing right ?
<grin>
Let's assume that this is still a problem, perhaps we may be forced to use a non-standard UUID. Ruins our standardization, but at least makes it simple to move betwen JADE systems. Or perhaps there is another UUID standard out there for embedded systems (who really have memory issuses) that we could use ?
For efficiency within a single server system, you could use just part of the UUID if you thought it was that much of an issue, as in your analogy below.
And applying the principle that only objects that need to be accessed externally require some form of UUID, a single-server system is just a special case were no objects are accessed externally.
True.
Though my question would be how can you be sure it will remain a single-server system ?
If it didn't take much more than setting a flag and doing a reorg to share an object, then this wouldn't be such a problem ( though even reorgs can be a problem based on what I've heard ) but otherwise it would make sense to build it in from the start, just in case it has to go multi-server later.
<snip>
Following your analogy, JADE does not provide the area or country codes at all, so when you _do_ want to talk non-locally, you are in trouble.
If the chosen approach to identifying JADE objects externally is to add a system qualifier, then the telephone analogy matches quite nicely. In the absence of the capability under discussion viz. JADE-to-JADE communications, country and area code equivalents would be redundant.
Yes, _IF_ it did so. But it doesn't right now, does it ?
I've explained in another post why this sort of mix up of location and identity is a bad idea.
<snip>
Hands up, how many JADE developers are re-implementing UUIDs continually?
I doubt you'll get many hands considering how difficult it is to connect JADE objects to anything right now, and that most JADE installations I've heard of seem to be built on top of relational or older legacy systems, so they won't be interested in exporting objects, just data.
How many times have you done this Frank?
Myself, I've never done it, because I've always built systems that worked internally using either UUID or some other guaranteed unique ID.
But I was involved in a project where we had to try and maintain a relationship with an external system that had no idea of UUIDs. It was basically impossible to ensure data integrity across the link, because the system on the other end did not have any form of reliable unique identification, so we effectively ended up replicating the whole external system inside our system, and tried to ensure our "model" of the external system remained reasonably up to date.
In case you're wondering, I've never done a commercial JADE system, the areas where I've worked would probably have, until recently, thought of JADE as "toy" and not ever seriously considered using it. Now it runs on AIX, they might look at it, but would be immediately put off by the lack of support for multiple servers.
Prior to the introduction of "Live Backup" (was that 5.0 or 4.0?) that would also have caused them to laugh JADE out of the shop.
Don't get me wrong, I like the ease with which you can build things in JADE, but in terms of scalability and reliability JADE is about where Microsoft was with it's first versions of MTS & SQLServer. Microsoft have made good, they are now serious contenders in some areas. JADE has aways to go to be able to mix it with the big boys, but the kid's got spunk, see ? One day he'll be a contender...
The big benefit JADE has is it's pure object model, and _that's_ why I think it's worth investing effort in.
<snip>
And it should be possible to do this merely by connecting to the JOM on System A and requesting the Customer object containing a particular UUID, in exactly the same way as you do internally to System B with an OID.
AH HA!, now you have actually admitted that system B only needs to use a UUID when accessing a customer object in system A, while using an OID to access a customer internally. This is perfectly true, but it is counter to all your arguments so far.
No it isn't. I was never arguing that it _needed_ the UUID internally, merely that using it internally meant that you didn't have to change your identification scheme when you went multi-server, among other benefits.
Another aspect of this scenario that you haven't mentioned, is that before they first connect, system B knows nothing about system A's objects; Prior to the first communication, system B has no knowledge of the identities of objects created by system A. In order to import an object reference (or references) from sysA, sysB must invoke some sort of service in A, and only at this time is it strictly necessary to establish an external-to-internal name mapping, which incidentally could possess one of several lifetimes (from session to lifetime of referenced object).
All true, but if you had a UUID you wouldn't need this mapping, and the "service" on A that returns the object would be exactly the same as the one that people "inside" server A would use.
BTW, again you're confusing object references with UUIDs. It's valid to have an object reference that has session lifetime, it isn't valid to have an object identifier that only has session lifetime unless it identifies a transient object.
Such a name mapping could also be implicit, if unique system identifiers were allocated to each co-operating JADE system.
I've discussed why mixing location with identity is a bad idea, and mentioned what I consider better solutions for locating objects, in another post..
In fact, in a predefined (as opposed to an ad-hoc) network, the user should request the object from System Bs JOM, which, when it finds it doesn't exist locally, should then query SystemA's JOM automatically (depending on the number of servers, and the topology of the network the algorithm for this remote query may have to be different)
There are a number of ways to address this requirement, again without resorting to assigning UUIDs to all objects before-hand.
I agree, I just believe that these other ways are not as beneficial
This sort of stuff is not hard, I was involved in writing this sort of code for a mobile radio network. There, the objects (the mobile radios) could change server of their own accord, and without informing the system, and we still had to find them !
Of course its not hard, but you have only addressed one part of a larger problem in isolation. What about larger issues of synchronising the commit of a global transaction involving multi-site updates.
That really has nothing to do with the subject.
That is up to your transaction management system, not your means of identifying objects. Though having a unique identifier for an object will probably make this easier too !.<grin>
With JADE as it is, any attempt to migrate objects of the same class between servers (or systems) requires implementation-dependant
creation of a UUID on top of the system UID, and if you want to
use the object between two systems in the future it requires you to continue managing and maintaining the relationship between the two
system UIDs, which is not something you want to
write more than once.
Who are you referring to in the above statement?
Anyone doing such work. Right now, this needs to be done should you wish to serve objects from JADE to elsewhere or between JADE systems.
That's not the only way to move _data_ between systems of course.
I would not be impressed if "the" JADE solution (if there ever is one*) required the developer to implement such a mapping individually for every system.
*BTW, this statement is not intended as negative. It could be a valid business decision for JADE to decide they will _never_ support multiple server systems. It would, IMO, limit their potential markets, and probably annoy a number of current customers, but it is a valid decision. The system works fines as it is for single servers, if it ain't broke don't fix it, that sort of thing.
With a UUID, none of this would be neccessary, an object with the same UUID would be the same object, no matter where it currently was, and
no matter how many copies we might have.
Now, where have I heard that before? Globally assigning UUIDs for all objects is *A* solution; it is not the only solution and futher it only addresses part of the problem.
Exactly. The thing is, it solves _part_ of a _lot_ of problems.
Obviously it's not a complete solution, but I'd contend it's certainly a good candidate for a step in the right direction.
Not that I'd advise anyone to accept my word for it, go out and look at other solutions,
if they work better for your circumstances, then fine. I happen to have found that in the areas I've been working they make things a lot easier, but that's just me.
This _could_ be solved by having JADE automatically maintain such a relationship between the systems, but that would be a lot of addittional overhead for something that could be more simply implemented by just using a UUID in the first place.
It could also be a lot lower overhead than just using UUIDs in the first place. Can you supply analytical evidence to the contrary, bearing in mind that you would need to consider all of a number of alternatives to your "UUID for every object" approach.
No, I can't provide analytical evidence. I seriously doubt that anyone other than a dedicated mathematician could do so. Have you ever tried to properly understand a statistical analysis of even something as simple as ethernet ? I know at one stage I have, from a paper in Bell Systems Journal, and I couldn't follow it, so I took it to my professor at the time, and he couldn't follow it either, so we took it it ot the head of the Maths department, and he said he wasn't sure, but he thought there was something wrong with the algebra, which made us all feel much better.
Based on my work on analysing frame relay and other network protocols, one would also need some serious computer power to do so as well. We regularly killed big SPARC stations when running this sort of analysis.
Oh, BTW, one doesn't have to rule out _every_ other approach, only ones that are being seriously considered.
However, I can report on a system that used UUIDs and achieved quite acceptable performance, and I have done so in another post..
Obviously, there are replication issues with holding instances with the same UUID on multiple servers, but these are solvable using such
concepts as master-slave copies, it's merely a matter of choosing
which update strategy would be most generally appropriate, or even allowing the developer to chose
the update strategy depending on the likely mobility of the object.
There are many issues to be addressed with replication, in the most flexible forms of replication conflict resolution when merging updates is a far more complex problem than simply identifying an object in a "family" of replicas.
Which is why a good replication design completely avoids the problem of merging updates by not allowing it to happen! <grin>
Yes, I agree, if you use batch replication or allow more than one user to update an object at a time, then you have those problems. Me, I'd avoid those solutions if at all possible.
If I am wrong about all this, and you can easily have multiple live servers with replication on a JADE system, or equivalently, easily migrate objects backwards and forwards between systems, in some other way, then I'd really like to learn how, as I will have been giving people the wrong information, which I don't like doing.
This final statement is perhaps the most disturbing.
Why do you find it disturbing ?
Do you really think that customers won't notice the difficulties ?
I get the feeling from your statement that you feel I should be trying to hide JADE's inadequacies. I'm sorry, but I'm not in marketing, I'm in education.
I understand that you currently work for Software Education Associates Ltd., who deliver JADE courses to current and prospective JADE users. Are we to understand that you are currently advising people that due to certain alleged design flaws, JADE will have difficulty in delivering the capabilities under discussion?
Well, personally I consider it a design flaw anyway, whether we're going multi-server/system or not.
The difficulties people have told me about when moving objects between design-time and run-time or between systems have convinced me of that. Implementing even a non-standard UUID concept would solve a number of problems even in single server.
As people seem to continually bring this up as a problem( those who have had some JADE experience prior to coming on the course) I feel it is neccessary to point out the cause, and how to try and avoid the problem.
However, if there is not some support for some form of UUID then multi-server/system is definitely compromised.
You, in your posts, have really only argued over how best to fix the flaw. The flaw is the lack of a UUID, whether it is fixed by only creating UUIDs for exported objects, by using UIIDs all the time, or some other means.
Actually, for the sort of people who are interested in this sort of thing, most of the time I don't advise them of it, they figure it out for themselves, I just get to confirm it.
Usually it goes like this, the student will say (maybe not as concisely as this ) "So if the OID is only server scoped, what happens when we add another server ?"
So I have to say "Well, basically, you can't" and then people get this incredulous look...
Some people haven't realized they can't have multiple servers up to this point, they've just asumed that, like other development systems, this is all handled by the system administrator. A dBA once laughed at this point and said to me words to the effect of "Do they seriously expect this to compete with Oracle ?". Actually he wasn't as nice about it as that, I think it involved a comparison with MS Access as well.
I can emphasize the fact that it's still a distributed system, because the clients can execute code too, as much as I like, people don't really believe it if you can't have multiple servers.
Frankie