Service-oriented computing is emerging as a promising approach for building highly distributed computer systems. In these systems, software applications dynamically discover and invoke the services of others, in order to complete their own workflows. However, participants in open distributed systems (such as the Web or large-scale Grids) are typically autonomous agents that follow their own decision-making mechanisms. Thus, service providers may defect, fail without warning or take longer than expected to fulfil service requests. This uncertainty poses a key challenge to service consumers, especially when they have strict deadlines for their workflows and when providers demand financial remuneration for their services.
In this talk, we address provider uncertainty by focussing on the process of service provisioning, i.e., deciding which providers to rely on for the constituent tasks of a workflow. In particular, we discuss a novel algorithm that deals with failures and uncertainty both reactively (by re-provisioning services at run-time) and proactively (by provisioning multiple services redundantly). We show how the algorithm can be applied in different scenarios where services are invoked on demand or where explicit service contracts are negotiated in advance. Finally, we outline empirical results to demonstrate that our algorithm performs well even in environments where providers are highly unreliable.