NSO 나노 서비스
1. 나노 서비스
나노 서비스의 필요성
- 복잡한 서비스를 설계할 때는 여러 측면(매핑 로직, 다양한 서비스 매개변수 최적화 방법 등)을 고려
- 다른 시스템과의 통합 요구 사항
- 서비스가 외부시스템과 연동되어야 하는 경우
- 서비스 인스턴스 생성 시 정보 가용성
- 서비스 생성 시점에 필요한 모든 정보가 준비되지 않을 수 있는 경우
- 단계별 구성 또는 제거 요구 사항
- 최종 서비스 구성이 여러 단계에 걸쳐 이루어지거나 제거도 단계별로 진행되어야 하는 경우
- 서비스 매핑 코드의 부수 효과(Side effects)
- 서비스 로직이 의도치 않거나 외부적인 변경을 유발할 수 있는 경우
통합 요구 사항
- 서비스의 일반적인 요구 사항 중 하나는 다른 시스템과의 통합
- 트랜잭션 모델에서 서비스 코드는 NSO 시스템의 전반적인 처리량을 유지하기 위해 빠르게 실행
- 나노 서비스를 사용하면 서비스 처리를 상태 단계로 나누고, 각 상태는 별도의 트랜잭션 내에서 처리됨
서비스 생성 시 사용할 수 없는 정보
- 나노 서비스는 서비스 인스턴스가 생성될 때 모든 정보를 사용할 수 없는 시나리오에 유용
단계별 구성 또는 제거
- 일부 시나리오의 경우 최종 서비스 구성의 첫 번째 단계가 다른 구성 작업보다 일찍 이루어져야 됨.
- 프로비저닝의 첫 번째 단계에서 네트워크 액세스를 구성하고 두 번째 단계에서 액세스 권한을 얻은 후 장치 구성을 수행하는 경우
- 가상 네트워크 기능(VNF)에 대한 VM을 요청하는 경우
- 가상 관리자가 VM을 시작하고 관리 인터페이스에 접속할 수 있게 되기 까지 시간이 걸릴 때, 다른 서비스 요청 수행
다단계 서비스 예시
- 서비스 사용자는 구성된 IP 주소를 가진 루프백 인터페이스를 원함
- 장치가 구성되기 전에 IP prefix가 할당되어야 한다는 전제 조건 필요
- 운영자가 루프백 서비스 인스턴스에 대한 IP prefix 할당
- 전제 조건이 충족된 후, 루프백 구성이 생성되어 장치로 푸시 가능
2. NSO 트랜잭션 모델
- NSO는 네트워크 전반의 트랜잭션 방식으로 설정 변경 사항을 적용
- 서비스 프로비저닝의 어떤 단계에서든 문제가 발생하면, NSO는 설정을 마지막으로 양호한 상태로 되돌린다.
- 설정이 생성되어 장치로 전송될 때, 이 작업은 트랜잭션 내부에서 발생
- 관련된 장치 중 하나라도 수신된 설정을 거부하면, NSO는 모든 관련 장치의 설정을 마지막 양호한 상태로 롤백
- NSO는 confirmed commit 기능을 지원하는 장치뿐 아니라 지원하지 않은 장치에서도 설정을 되돌릴 수 있다.
- NSO 트랜잭션 모델은 서비스 개발을 간소화 함
- 모든 구성 요청은 Queue에 저장되어 순차적으로 실행
- 장점
- 서비스 개발자가 데이터 무결성이나 잠재적인 경쟁 상태에 대해 걱정할 필요가 없다는 것
- 단점
- NSO 시스템 처리량이 낮아 주어진 시간 내에 처리할 수 있는 서비스 요청 수가 줄어든다는 것
모델 작동 방식
- 처리 중인 다른 트랜잭션이 있는 경우 새로운 서비스 구성 요청이 수신되어 대기열에 추가되며 트랜잭션 잠금이 획득 됨. 잠금이 해제될 때까지 다른 구성 변경은 허용하지 않음
- 서비스에서 장치 모델로의 매핑이 발생
- 장치 구성은 NED를 사용해 생성되어 장치에 푸시
- 장치가 구성을 수락하거나 트랜잭션을 중단. 관련 장치 중 하나에서 중단이 발생하면 NSO는 해당 장치와 CDB의 변경 사항을 롤백함. 잠금이 해제되고 다른 트랜잭션을 시작할 수 있음.
Python 코드 예제
- Python 코드 또한 잠금 상태에서 실행되므로 빠르게 실행 되는 것이 중요
- create_cb()에서 외부 시스템과 통신하거나 복잡하고 오래 실행되는 로직이 포함되어 있으면 아래를 고려
- 서비스 로직을 여러 단계로 구현하는 나노 서비스(nano service) 사용
- 장기 실행 작업에 대해 구성을 잠그지 않는 사후 작업(post actions) 사용
- 구성 잠금 외부에서 호출되는 pre_lock_create_cb() Python 콜백을 사용
- 코드 샘플
class MyService(Service): @Service.pre_lock_create def cb_pre_lock_create(self, tctx, root, service, proplist): # 여기에 오래 실행되는 작업을 수행합니다.