Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

managed 동기화 세션 - Node.js SDK

이 페이지의 내용

  • 전제 조건
  • 액세스 동기화 세션
  • 동기화 세션 일시 중지 또는 재개
  • 동기화 세션을 일시 중지해야 하는 경우
  • 업로드 및 다운로드 대기
  • 동기화 세션에 대한 업로드 및 다운로드 진행률 확인
  • 네트워크 연결 확인
  • 멀티플렉싱 동기화 세션

Realm Mobile Sync를 사용하면 Node.js SDK는 동기화 세션을 사용하여 백그라운드에서 데이터를 Atlas와 동기화합니다. 동기화 세션은 동기화된 영역을 열 때마다 시작됩니다.

동기화 세션을 managed하려면 먼저 다음을 수행해야 합니다.

  1. 동기화된 Realm 열기

  2. 동기화 구독 추가

동기화된 Realm을 연 후 Realm .syncSession 영역 속성 사용하여 해당 동기화 세션 에 액세스 할 수 있습니다.

const realm = await Realm.open(config);
const syncSession = realm.syncSession;

동기화된 영역 을 열면 동기화 세션 이 시작됩니다. 영역 에서 동기화 세션 을 일시 중지했다가 다시 시작할 수 있습니다. 동기화 세션을 일시 중지하면 해당 Realm의 동기화 세션 동기화 세션 만 일시 중지됩니다. 열려 있는 영역 이 두 개 이상 있는 경우 일시 중지해도 다른 Realm의 동기화 세션에는 영향을 주지 않습니다.

동기화를 일시 중지하려면 syncSession.pause() 메서드. 동기화를 재개하려면 syncSession.resume() 메서드.

const behaviorConfiguration = {
type: "openImmediately",
};
const config = {
schema: [DogSchema],
sync: {
user: app.currentUser,
partitionValue: "MyPartitionValue",
newRealmFileBehavior: behaviorConfiguration,
existingRealmFileBehavior: behaviorConfiguration,
},
};
const realm = await Realm.open(config);
const pauseSyncSession = () => {
realm.syncSession?.pause();
};
const resumeSyncSession = () => {
realm.syncSession?.resume();
};
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = {
type: Realm.OpenRealmBehaviorType.OpenImmediately,
};
const config: Realm.Configuration = {
schema: [DogSchema],
sync: {
user: app.currentUser!,
partitionValue: "MyPartitionValue",
newRealmFileBehavior: behaviorConfiguration,
existingRealmFileBehavior: behaviorConfiguration,
},
};
const realm = await Realm.open(config);
const pauseSyncSession = () => {
realm.syncSession?.pause();
};
const resumeSyncSession = () => {
realm.syncSession?.resume();
};

대부분의 애플리케이션은 동기화 세션을 수동으로 일시 중지했다가 다시 시작할 필요가 없습니다. 그러나 동기화 세션을 일시 중지하거나 일시 중지해야 하는 몇 가지 상황이 있습니다.

  • 사용자가 특정 조치를 취한 후에만 동기화하려는 경우

  • 하루 중 특정 시간에만 동기화하려는 경우

  • 네트워크 연결이 좋지 않을 때 동기화를 시도하고 싶지 않은 경우

  • 동기화 세션을 명시적으로 강제로 연결하려는 경우

네트워크 연결이 좋지 않은 경우 계속해서 네트워크 연결을 설정하려고 하면 사용자의 장치 배터리가 소모될 수 있습니다.

동기화 세션을 연결하도록 명시적으로 강제하는 경우는 가장 일반적으로 일정 시간 동안 오프라인 상태인 것과 관련이 있습니다. 동기화 클라이언트는 연결을 시도하지만 실패 시 지수 백오프 상태가 됩니다. 클라이언트가 오랫동안 오프라인 상태였다가 즉시 다시 연결되지 않을 수 있습니다. 동기화 세션을 일시 중지했다가 다시 시작하면 명시적으로 연결이 강제로 적용됩니다.

동기화 세션을 일시 중지할 때는 다음 사항에 유의하세요.

  • 클라이언트가 클라이언트 최대 오프라인 시간 보다 오래 오프라인 상태일 수 있는 경우 클라이언트는 동기화를 다시 시작할 수 없으며 클라이언트 재설정을 수행해야 합니다.

  • 동기화 세션을 일시 중지하면 양쪽 방향에서 모두 일시 중지됩니다. 앱이 기기에서 수행하는 변경 사항은 백엔드 동기화되지 않으며, 백엔드 또는 다른 기기에서 변경한 데이터는 기기에 동기화되지 않습니다. 업로드만 일시 중지 또는 다운로드만 일시 중지할 수 있는 방법은 없습니다.

  • 클라이언트가 백엔드와의 동기화를 영구적으로 중지하도록 하려면 동기화 세션을 일시 중지하지 마세요. 동기화를 영구적으로 중지하려면 동기화된 영역의 콘텐츠를 동기화되지 않은 영역에 복사하고 클라이언트에서 동기화되지 않은 영역을 사용합니다.

무기한 또는 월 및 연도 단위의 시간 범위 동안 동기화를 중지하기 위해 동기화를 일시 중지 하지 마세요 . 이 사용 사례에 맞게 기능이 설계되거나 테스트되지 않았습니다. 이러한 방식으로 사용하면 다양한 문제가 발생할 수 있습니다.

동기화된 Realm에서 모든 변경 사항이 Atlas 로 업로드될 때까지 비동기적으로 기다리려면 영역 () 를 호출합니다. 이 메서드는 모든 변경 사항이 업로드되면 true를 반환합니다.

realm.write(() => {
realm.create(Doggie, {
_id: new BSON.ObjectID(),
owner_id: app.currentUser!.id,
name: "Maui",
age: 3,
});
});
await realm.syncSession?.uploadAllLocalChanges();

Atlas의 모든 변경 사항이 Device Sync 서버에서 동기화된 Realm으로 다운로드될 때까지 비동기적으로 기다리려면 downloadAllServerChanges() 를 호출합니다. 이 메서드는 모든 변경 사항이 다운로드되면 true를 반환합니다.

await realm.syncSession?.downloadAllServerChanges();

앱 구성 에서 요청 시간 제한을 지정할 수 있습니다. 제한 시간을 지정하면 BaseSyncConfiguration 에서 cancelWaitsOnNonFatalErrors 를 설정할 수 있습니다. true 및 시간 초과 간격에 도달하면 업로드 및 다운로드를 기다리고 있는 모든 미해결 작업이 취소됩니다. 이 설정이 false이면 Realm은 이러한 시간 초과를 치명적이지 않은 오류로 처리하므로 업로드 및 다운로드 대기 중이 취소되지 않습니다.

자세한 내용 은 앱 클라이언트에 대한 시간 초과 구성 및 시간 초과 후 비동기 작업 취소를 참조하세요.

동기화 세션의 업로드 및 다운로드 진행률을 확인하려면 syncSession.addProgressNotification() 메서드 를 사용하여 진행률 알림을 추가합니다. 메서드.

syncSession.addProgressNotification() 메서드는 다음 세 가지 매개변수를 사용합니다.

  • direction 매개변수입니다. 데이터 업로드에 대한 알림을 등록하려면 "upload" 로 설정합니다. 데이터 다운로드에 대한 알림을 등록하려면 "download" 로 설정합니다.

  • mode 매개변수입니다. "reportIndefinitely" 로 설정하면 syncSession.removeProgressNotification() 을 사용하여 콜백이 등록 취소될 때까지 알림이 계속됩니다. 현재 전송 가능한 바이트만 동기화될 때까지 알림을 계속하려면 "forCurrentlyOutstandingWork" 로 설정합니다.

  • 인수가 transferredtransferable 인 콜백 함수 매개 변수입니다. transferred 는 이미 전송된 현재 바이트 수입니다. transferable 은 이미 전송된 총 바이트 수에 전송 대기 중인 바이트 수를 더한 값입니다.

참고

Flexible Sync 진행 상황 알림은 아직 완전히 지원되지 않습니다. Flexible Sync를 사용하는 경우 변경 사항이 통합된 후에만 다운로드가 알림을 보고합니다. 파티션 기반 동기화는 변경 사항 다운로드가 진행되면 지속적인 알림을 제공합니다. 업로드는 두 동기화 모드에서 진행 중인 진행 상황 알림을 보고합니다.

예시

다음 예제에서 애플리케이션 개발자는 업로드 이벤트를 무기한 수신하기 위해 syncSession 에 콜백을 등록합니다. 개발자가 Realm에 쓰기를 수행한 다음 syncSession 알림 콜백을 등록 취소합니다.

const behaviorConfiguration = {
type: "openImmediately",
};
const config = {
schema: [DogSchema],
sync: {
user: app.currentUser,
partitionValue: "MyPartitionValue",
newRealmFileBehavior: behaviorConfiguration,
existingRealmFileBehavior: behaviorConfiguration,
},
};
const realm = await Realm.open(config);
const handleNotifcationRemoval = (transferred, transferable) => {
console.log(`There were ${transferable} transferable bytes total.`);
console.log(`${transferred} bytes were transferred.`);
};
const handleNotifications = (transferred, transferable) => {
if (transferred === transferable) {
console.log(
`${transferred} bytes of ${transferable} were transferred.`
);
// Remove progress notification.
realm.syncSession?.removeProgressNotification(handleNotifcationRemoval);
}
};
realm.syncSession?.addProgressNotification(
"upload",
"reportIndefinitely",
handleNotifications
);
// Upload a Realm object.
const dog = realm.write(() => {
return realm.create("Dog", {
_id: new Realm.BSON.ObjectID(),
MyPartitionValue: "MyPartitionValue",
name: "Fido",
age: 2,
});
});
const behaviorConfiguration: Realm.OpenRealmBehaviorConfiguration = {
type: Realm.OpenRealmBehaviorType.OpenImmediately,
};
const config: Realm.Configuration = {
schema: [DogSchema],
sync: {
user: app.currentUser!,
partitionValue: "MyPartitionValue",
newRealmFileBehavior: behaviorConfiguration,
existingRealmFileBehavior: behaviorConfiguration,
},
};
const realm = await Realm.open(config);
const handleNotifcationRemoval = (
transferred: number,
transferable: number
) => {
console.log(`There were ${transferable} transferable bytes total.`);
console.log(`${transferred} bytes were transferred.`);
};
const handleNotifications = (transferred: number, transferable: number) => {
if (transferred === transferable) {
console.log(
`${transferred} bytes of ${transferable} were transferred.`
);
// Remove progress notification.
realm.syncSession?.removeProgressNotification(handleNotifcationRemoval);
}
};
realm.syncSession?.addProgressNotification(
Realm.ProgressDirection.Upload,
Realm.ProgressMode.ReportIndefinitely,
handleNotifications
);
// Upload a Realm object.
const dog = realm.write(() => {
return realm.create("Dog", {
_id: new Realm.BSON.ObjectID(),
MyPartitionValue: "MyPartitionValue",
name: "Fido",
age: 2,
});
});

서버에 대한 연결의 현재 상태를 확인하려면 syncSession.connectionState() 메서드.

Realm의 오프라인 우선 설계는 일반적으로 현재 네트워크 연결 상태를 확인할 필요가 없음을 의미합니다. 즉, 앱이 서버에 대한 연결의 현재 상태를 가져와야 하는 경우 syncSession.connectionState() 메서드를 사용할 수 있습니다.

const config = {
schema: [DogSchema],
sync: {
user: app.currentUser,
partitionValue: "MyPartitionValue",
},
};
const realm = await Realm.open(config);
const connectionState = realm.syncSession?.connectionState;
const config: Realm.Configuration = {
schema: [DogSchema],
sync: {
user: app.currentUser!,
partitionValue: "MyPartitionValue",
},
};
const realm = await Realm.open(config);
const connectionState = realm.syncSession?.connectionState;

세션 멀티플렉싱 활성화 Realm 앱 의 여러 동기화 세션을 통합합니다. 파일 디스크립터 제한에 도달했다는 오류가 표시되고 많은 동기화 세션을 사용하고 있는 경우에만 세션 멀티플렉싱을 사용하세요.

세션 멀티플렉싱을 활성화하려면 Realm.App.Sync.enableSessionMultilexing() Realm.App과 함께 사용하세요.

예시

Realm.App.Sync.enableSessionMultiplexing(app);

돌아가기

Flexible Sync 구독 관리