Ответ
zip и combineLatest - основные операторы для параллельного выполнения запросов.
zip - объединяет результаты строго попарно, дожидается завершения всех источников:
Observable.zip(
api.getUser(),
api.getProfile(),
BiFunction { user, profile -> Pair(user, profile) }
).subscribe { (user, profile) -> ... }
combineLatest - испускает значение при каждом изменении любого из источников:
Observable.combineLatest(
db.getCachedData(),
api.getFreshData(),
BiFunction { cached, fresh -> mergeData(cached, fresh) }
)```
Для отмены при ошибке используй `amb`, для фонового выполнения - `subscribeOn`.