Re: I-D ACTION:draft-tewari-webi-wcdp-00.txt,.ps
"Thirumale Niranjan" <[email protected]> Wed, 10 Apr 2002 15:23:06 -0400
| Newsgroups | gmane.ietf.webi |
|---|---|
| Message-ID | <[email protected]> |
Ted, Thanks for your comments. My responses in-line with your questions and comments. -Niranjan. Ted Anderson <[email protected]> on 04/10/2002 12:36:14 PM To: [email protected], Renu Tewari/Watson/IBM@IBMUS cc: Srikanth Ramamurthy/Pittsburgh/IBM@IBMUS, Thirumale Niranjan/Pittsburgh/IBM@IBMUS Subject: Re: I-D ACTION:draft-tewari-webi-wcdp-00.txt,.ps Comments on Web Content Distribution Protocol (WCDP) based on draft-tewari-webi-wcdp-00.txt, by Tewary, Niranajan [sic], and Ramamurthy dated February 2002. Looks like Niranjan's name is spelled wrong. There are some non-ascii characters in the .txt file which appear okay in the postscript version. Will fix. In the terminology section, "heartbeat" is described as being sent from the invalidation server to the client caches. However, neither of these two entities is defined in this section. I'm guess that these are the WCDP server and WCDP client, respectively, but maybe this should be clarified. OK. Odd that heartbeats travel from server to client, not the more traditional direction, from client to server. Is there a justification for this? I suppose the reason is that invalidations are emitted from the server, so it is the one that wants to determine proactively if an invalidation might timeout due to a client failure. In the case of delta consistency, a missing heartbeat indicates that an invalidation could also have been missed. In the case of strong consistency, the receipt of the heartbeat effectively extends to the lease granted by the server to the client. So too many missed heartbeats allows the lease to expire and invalidates the corresponding cached objects. [ Just thinking out loud here. ] Since the clients represent the data repositories (caches/data servers), they need to know about the invalidation servers state that pertains to them (the clients). That is, a client would need to figure out whether the invalidation server considers the client "active". It needs to differentiate between a situation where there is no activity (e.g., nothing has been invalidated for a while), and a situation where the invalidation server is not sending it any invalidations because it has seen a network partition or some other failure. Therefore, the server needs to send the client a heartbeat, so that can know the state of the client as the server sees it. Does scalability goal include the ability for WCDP clients to communicate with very many WCDP servers? We did not consider that a requirement. However, if a client is at an ISP (say, as a forward proxy), I can imagine that it would have to receive invalidations from a large number of invalidation servers, assuming that each domain (or CDSP, in some scenarios) correspond to one invalidation server. In any case, our clients are basically passive listeners, so scalability in this respect should be easier to achieve. It doesn't seem like the refresh directive avoids any extra messages compared to simple invalidation. Is it only intended to reduce latency? Yes. It's an "update" feature, as opposed to plain invalidates. Our experience shows that the capability to preload content is key to avoiding latency. Often, content is accessed in a burst at predefined times, so the latency will affect not just the first requestor, but many (thousands of) requestors who are concurrent with the first requestor. The Sydney Olympics web site and hosting solution saw a lot of benefit in avoiding "miss storms". The delayed refresh directive would seem to put the onus of spreading delay on the server which must provide explicit scheduling to the clients. It would seem better for the refresh directive to provide a time range which clients should select delays with uniform probability, at least as an option. Assuming the server knows how many client it has an how many requests per second it can handle this time range should be easy to derive. In the absence of such information the probabilistic mechanism would be much easier to configure than a static value. Agreed. Actually, the "delayed refresh" directive is itself a secondary option. WCDP has in-built scalability features -- we distribute notifications in "waves". A wave corresponds to a set of clients, i.e., a client could belong to any wave. Each wave pulls content from a wave prior to it. By organizing the hierarchy appropriately, this allows for intermediate staging servers that could be used for content distribution. The notification carries with it a list of nodes that the client can pull the content from. The list is augmented at the beginning of each wave. I don't think this was described in detail in the document. I don't understand implicit subscriptions. It sounds like the administrative step means that each fetch registers a subscription for the corresponding (individual) object, not a content group. Subscriptions could be initiated in many ways: (1) server decides that a client that requests a certain object wll be notified about invalidations to that object -- if we need to keep this in sync with the content group notion, we could just say that the server will subscribe the client to all content groups to which the object belongs. (2) client can initiate the subscription itself -- 2(a) clients can run heuristics on access patterns, popularity etc., and come up with subscription requests dynamically, or 2(b) administrators specify content groups that a client should subscribe to, through a (remote) administration API. In explicit subscriptions it says: "send invalidations to objects belonging" but you probably mean "for objects" not "to objects". There seems to be some confusion between the WCDP server and the Origin server. The text seems inconsistent about which one sends invalidation. Since content groupings are part of metadata they are reported in the HTTP headers which presumably come from the origin server. Clearly, it must know about group membership so these groups are not something the WCDP server can define on its own. Maybe it would be good to clarify the distinction of roles more clearly or describe the practical limits to their separation. Will describe this in more detail. In a nutshell, we imagine that these groupings will be given as metadata by a content management/publishing system, which will also generate some kind of a notification to the invalidation server. Therefore, the groupings are available to both the WCDP server and the origin server. In section 4.4 the text says that the differences between "strong and weak consistencies are not significant...". It seems that the key difference is that for weak consistency when sending invalidations the server must wait until all responses are received. For weak it doesn't need to wait. Maybe this sentence doesn't add anything and can be removed. Bug. Maybe we intended to say something else :-) I'll check. In node-level strong consistency, why do servers have to wait for clients to retrieve the new content before making it live. This seems sure to delay the process (especially if the delayed refresh directive is used) but doesn't improve the consistency. Also in this case, the client need a special way to get the not-yet-live content from the origin server. How do they do this? Let's say there is a large object that needs to be updated at two clients, in a strongly consistent manner. That is, we expect the clients to expose the object to external requests at approximately the same time. However, since the object is large, and the speed of the network between the clients and the origin could be very different, one client could end up retrieving the object much before the other. Therefore, all clients should be synchronized as much as possible. Doing it in a two-phase manner achieves this. The same argument holds for why a server cannot make it live before that -- the end user experience will be inconsistent. To get at the data, clients can go to a special staging server that has updated content but is not exposed to public clients. Alternatively, they can go to the origin, but identify the request as a WCDP request, via a special header, so that the origin can serve out the not-yet-live content. Our product takes the first approach; the latter approach needs to be fleshed out in more detail. The force option in the invalidate request seems dubious. What happens if a client declines to perform the invalidation in response response to a force, or an update perhaps due to a network outage. What does it "mean" for the server to specify force? How does force impact the semantics of the consistency guarantees? I guess we haven't *clearly* defined the meaning of the "force" option. I don't understand what you mean by a "client declines" -- if we say that a force is not declinable, then the client cannot decline. For an update, we could say that if a client is not able to update the content, perhaps due to a network outage, an invalidate would preserve correctness. In any case, we need to specify the exact response codes and such. The wave description of propagating invalidations in section 4.6 is confusing. How does the invalidation wave carry with it the list of notified clients and how does this influence the pulling of data? Also we have clients fetching data from WCDP servers, not origin servers here, but I thought that was only the roll of origin servers. Maybe the mapping of rolls across levels of the hierarchy need to be better explained. Will try to clarify the description. Is the organization of an WCDP client/server hierarchy is outside the scope of this protocol? It would seem that NTP-like stratum mechanism could be used to to self-organize CDN intermediates into a tree. This would allow automatic mechanisms to construct the hierarchy, which should be much easier to maintain and define than a static configuration. Yes, it is out of scope of the protocol. I agree, there could be automatic mechanisms for this. Explicit consistency is typically much weaker than strong consistency, unless the HTTP cache directives are all set appropriately (i.e. "do not cache"). Thus it would seem that falling from strong back to explicit consistency rules during a server outage would be unsafe. Maybe reverting to uncached (as while waiting for a commit) would be safer for content groups that desire strong consistency? Since there will always be caches that are not RUP-compliant, administrators MUST use HTTP headers in a responsible way, so that unsafe behavior is not seen at caches. Therefore, it is not a stretch to assume that administrators will continue to use these headers. Since a WCDP cache will overrule the cache-control headers if the object is being subscribed to, administrators can set a conservative (small) value to the TTL, so that safe behavior is exhibited by other caches, browsers etc. Therefore, falling back to explicit consistency is not unsafe. In section 4.7 it sounds like servers don't detect failed clients via heartbeat timeouts. Is the assumption that the transport mechanism won't notify the server of a failure to deliver a heartbeat request too strong? This means of failure detection would help reduce the latency of invalidations when some clients have failed. For servers with many clients, or at the root of large hierarchies, this will likely be a crucial optimization. Servers do detect failed clients when a message (including heartbeats) do not make it to the clients, or an acknowledgement is not received within a timeout period. In handling failures of refresh directive, this section says that the client will try another WCDP server. But that won't help if the origin server is down, because all WCDP server share the same Origin server. I guess just don't understand the Origin/WCDP server distinction. Also I thought the refresh directive is basically a performance optimization, but it sounds from this paragraph (i.e. a failure to refresh caused the invalidation to fail) that there are semantic implications the affect the consistency guarantees. I don't understand what those are. The refresh directive is indeed a performance optimization for a cache. But since we intend this to be an update protocol that is used to notify web servers (by that, I mean an authoritative source of content) in rehosting sense, or mirrored servers, an "update" can have a mandatory feel to it. Also, it would help to think of multiple sources of content, not just one "origin". If one fails, the client could go to any of the other nodes which has the updated content. I am sorry these comments are so late in coming, but I hope they are of some use. Ted Anderson