  Cloud computing with its three key facets (i.e., IaaS, PaaS, and SaaS) and
its inherent advantages (e.g., elasticity and scalability) still faces several
challenges. The distance between the cloud and the end devices might be an
issue for latency-sensitive applications such as disaster management and
content delivery applications. Service Level Agreements (SLAs) may also impose
processing at locations where the cloud provider does not have data centers.
Fog computing is a novel paradigm to address such issues. It enables
provisioning resources and services outside the cloud, at the edge of the
network, closer to end devices or eventually, at locations stipulated by SLAs.
Fog computing is not a substitute for cloud computing but a powerful
complement. It enables processing at the edge while still offering the
possibility to interact with the cloud. This article presents a comprehensive
survey on fog computing. It critically reviews the state of the art in the
light of a concise set of evaluation criteria. We cover both the architectures
and the algorithms that make fog systems. Challenges and research directions
are also introduced. In addition, the lessons learned are reviewed and the
prospects are discussed in terms of the key role fog is likely to play in
emerging technologies such as Tactile Internet.
