Кстати по поводу очередей на базе AMQP. Если есть возможность слушать очередь на стороне пользователя, то есть различные варианты маршрутизации, по крайней мере в rabbitmq
Выше по теме уже написали насчет REST концепции. Думаю можно посмотреть и в сторону SOAP, хотя это более громоздкое решение. Но это что касается взаимодействий через http. А в общем случае это же просто интерфейс взаимодействия с системой, который должен быть описан в каком-либо формате и протокол для этого взаимодействия. То есть по сути вам нужно решить 2 основных вопроса: реализация логики API и способ коммуникации с внешним миром. Вы например можете написать некий класс, скажем MyCoolAPI, каждый метод которого будет обрабатывать соотв. запрос. И если клиенты для вашего API способны использовать этот класс непосредственно, то всё готово. Если клиентская технология не позволяет этого, тогда множество способов, от общения через сокеты до SOAP и REST. Это конечно совсем упрощенно. Хотя по-моему, при разработке внешнего интерфейса к системе усложнять ничего не нужно, это всего лишь интерфейс)
Ну тут даже не обязательно прямо два кластера целых. Вам хватит по одной дополнительной реплике на шард. То есть мастер-реплики будут просто местами меняться на время очищения.
Пришла такая идея, но не уверен в её работоспособности. Надо проверять. Суть в следующем. Поскольку каждый шард представляет собой набор реплик, то каждый такой набор можно синхронизировать с помощью комманды rs.syncFrom(:). Когда нам надо почистить кластер, тогда происходит переключение на второй кластер. Первый останавливается и очищается. Потом с помощью syncFrom производится синхронизация реплик очищенного кластера с репликами активного. При этом синхронизируем мастер-реплику из очищенного шарда с мастером(хотя может и с любым слейвом) из соответсвующего активного шарда. По идее после синхронизации мастер должен будет разбросать данные по слейвам.
На уровне приложения скорее всего. Добавить что-то вроде двух режимов работы, при переключении на другой кластер, первый очищается и наоборот. Только надо будет позаботиться о синхронизации данных.
Для начала стоит выделить куски, которые повторяются и оформить в функции. Потом логически связанные части (функционал одной «тематики») объединить в классы. Появится какая-никакая структурность. После этого уже оптимизировать сам код функций и методов, удалить оттуда мусор, лишние переменные и прочее.