P2P-PL: A pattern language to design efficient and robust peer-to-peer systems