Jak wygląda Twoja architektura wdrażania? Jestem nieco zdezorientowany, kiedy mówisz "wiele serwerów" - masz na myśli wiele instancji mongo? Poza tym jest to trochę mylące, gdy określasz swoje wymagania. Zgodnie z wymogiem 1, jeśli przesyłasz do S3, plik gridfs powinien zostać usunięty. Jednak zgodnie z twoimi wymaganiami, nie może istnieć zarówno w S3, jak i Gridfs, więc wymaganie 2 wydaje się być sprzeczne z pierwszym, tj. Nie powinno istnieć w gridfs w pierwszej kolejności. Czy zachowujesz niektóre pliki na Gridfach i S3?
Jeśli używasz zestawu replik lub klastra z sharded, możesz utworzyć tailable cursor w kolekcji gridfs (możesz to zrobić również na pojedynczym węźle, chociaż nie jest to zalecane). Kiedy zobaczysz operację wstawiania (będzie wyglądać jak "op": "i"), możesz wykonać skrypt lub zrobić coś w swojej aplikacji, aby pobrać plik z gridfs i przesłać odpowiedni plik do s3. Podobnie, gdy zobaczysz operację usuwania ("op": "d"), możesz skasować plik z s3.
Piękno kursora, który można ustawić w trybie ciągłym, polega na tym, że pozwala na operacje asynchroniczne - można mieć inny proces monitorowania oploku na innym serwerze i wykonywania odpowiednich działań.
Nie jestem pewien, ale zobacz, czy [to] (http://stackoverflow.com/questions/17871568/rails-3-paperclip-can-i-store-images-both-on-s3-locally/17893929#17893929) help – Viren