Page History
...
- Docs/Guides
- akka.net 이용하는경우
- https://github.com/psmon/NetCoreLabs 이코드를 받아서 지식으로활용
- 코틀린에서 akka오픈(pekko) 이용하는경우
- 시도하고싶은 오픈소스 샘플코드가 있다고하면 유사한 형태로 하위에 그냥 때려박으면 되겠습니다.
- 과거에는 오픈소스를 해석하고 실험하고 했다고하면 여기서의 컨셉은~ 좋은 코드컨셉이 있다고 느낌이오면 샘플코드를 넣어 고급패턴을 바로 이용하는 전략입니다.
- akka.net 이용하는경우
이 실험에 이용된 생성지침과 실제 지식파일입니다.
| View file | ||||
|---|---|---|---|---|
|
| Info |
|---|
cluade 코드를 실행한후 > "생성지침.md" 수행해줘 팁 : alt+tab을 눌러 plan mode로 전환한후 수행합니다. 안해줘도 plan mode라 판단되면 수행하는듯하나 명시적 수행모드로 |
...
- 의존성에러가남
- 의존성 버전을 못맞춰서 오류를 일으킴 : 빌드언어의 특징이기도 한데 오류내용 복붙해서 고쳐달라고하면 고쳐줌
- AI가 의존버전 맞추기 놀이는 잘못하는듯 ... ( 물론 마이너 소수점 하나 다르다고 호환안되는것은 라이브러리 특수성의 문제 )
- 하지만 이 케이스에선~ 오리지널 구현 버전 놔두고 엄한 버전을 테스트종속에 추가한듯
- 플래닝모드 이후 이제부터 바이브 모드(auto-accept editon) 동일세션에서 오류를 고치거나 개선해나감
...
- 테스트 클라이언트 옵션 꼼꼼히 잘 만들어준듯
- 유닛테스트 작성시 버전못맞춘거 말고 여기까지 작동까지 잘수행됨
문서화만들기
문서화도 귀찮으니~ 잘작동하고 돌아가면 문서화까지 요청
...
| Code Block | ||
|---|---|---|
| ||
# PushServiceNet - Real-time Push Notification Service
## 개요
PushServiceNet은 ASP.NET Core와 Akka.NET 액터 모델을 기반으로 구축된 실시간 푸시 알림 서비스입니다. Server-Sent Events (SSE)를 활용하여 실시간 통신을 구현하며, 오프라인 사용자를 위한 메시지 히스토리 기능을 제공합니다.
## 주요 특징
- 🚀 **실시간 푸시 알림**: SSE를 통한 단방향 실시간 통신
- 📢 **토픽 기반 발행/구독**: 토픽별 메시지 라우팅
- 💾 **메시지 히스토리**: 사용자당 최대 100개 메시지 저장
- 🎭 **액터 모델**: Akka.NET을 활용한 상태 관리
- 🔄 **자동 재연결**: 하트비트를 통한 연결 상태 관리
- 🧪 **테스트 클라이언트**: 웹 기반 대화형 테스트 도구
## 시스템 아키텍처
### 액터 시스템 구조
```mermaid
graph TD
A[ActorSystem<br/>PushServiceSystem] --> B[TopicManagerActor<br/>Singleton]
B --> C[UserTopicActor<br/>user-1]
B --> D[UserTopicActor<br/>user-2]
B --> E[UserTopicActor<br/>user-N]
C --> F[Message Queue<br/>+ History]
D --> G[Message Queue<br/>+ History]
E --> H[Message Queue<br/>+ History]
```
### 메시지 흐름도
```mermaid
sequenceDiagram
participant Client
participant API
participant TopicService
participant TopicManager
participant UserActor
participant SSEService
Client->>API: POST /api/topic/publish
API->>TopicService: PublishMessageToTopicAsync()
TopicService->>TopicManager: PublishToTopic
TopicManager->>TopicManager: Find subscribers
loop For each subscriber
TopicManager->>UserActor: TopicMessage
UserActor->>UserActor: Store in queue & history
end
Note over SSEService: Polling loop (1초마다)
SSEService->>UserActor: CheckForMessages
UserActor-->>SSEService: TopicMessage or Heartbeat
SSEService-->>Client: SSE Event
```
## API 엔드포인트
### 1. 토픽 구독
```http
POST /api/topic/subscribe
Content-Type: application/json
{
"userId": "user1",
"topicName": "topic-a"
}
```
### 2. 토픽 구독 해제
```http
POST /api/topic/unsubscribe
Content-Type: application/json
{
"userId": "user1",
"topicName": "topic-a"
}
```
### 3. 메시지 발행
```http
POST /api/topic/publish
Content-Type: application/json
{
"topicName": "topic-a",
"content": "Hello, World!",
"senderId": "publisher1" // Optional
}
```
### 4. 메시지 히스토리 조회
```http
GET /api/topic/history/{userId}
```
### 5. SSE 연결
```http
GET /api/sse/connect/{userId}
```
## SSE 이벤트 형식
### 메시지 이벤트
```javascript
event: message
id: 550e8400-e29b-41d4-a716-446655440000
data: {
"id": "550e8400-e29b-41d4-a716-446655440000",
"event": "message",
"topic": "topic-a",
"data": "Hello, World!",
"timestamp": "2024-01-13T10:30:00Z",
"senderId": "publisher1"
}
```
### 하트비트 이벤트
```javascript
event: heartbeat
data: {"timestamp":"2024-01-13T10:30:00Z"}
```
## 프로젝트 구조
```
PushServiceNet/
├── PushServiceNet/
│ ├── Actors/
│ │ ├── TopicManagerActor.cs # 토픽 및 구독 관리
│ │ └── UserTopicActor.cs # 사용자별 메시지 관리
│ ├── Controllers/
│ │ ├── TopicController.cs # REST API 엔드포인트
│ │ └── SSEController.cs # SSE 연결 엔드포인트
│ ├── Models/
│ │ ├── ActorMessages.cs # 액터 통신 메시지
│ │ ├── Topic.cs # 토픽 모델
│ │ ├── TopicMessage.cs # 메시지 모델
│ │ ├── UserSubscription.cs # 구독 정보 모델
│ │ └── SSENotification.cs # SSE 알림 모델
│ ├── Services/
│ │ ├── AkkaService.cs # Akka 시스템 관리
│ │ ├── TopicService.cs # 비즈니스 로직
│ │ └── SSEService.cs # SSE 연결 관리
│ ├── wwwroot/
│ │ └── index.html # 테스트 클라이언트
│ └── Program.cs # 애플리케이션 진입점
└── PushServiceNetTest/
└── TopicSubscriptionTests.cs # 유닛 테스트
```
## 핵심 컴포넌트
### TopicManagerActor
- 모든 토픽과 구독 관계 관리
- 사용자 액터 생성 및 관리
- 메시지 라우팅 담당
### UserTopicActor
- 사용자별 구독 토픽 목록 관리
- 메시지 큐 및 히스토리 관리 (최대 100개)
- SSE 전송을 위한 메시지 대기열 처리
### SSEService
- SSE 연결 수명 주기 관리
- 1초마다 메시지 폴링
- 하트비트를 통한 연결 유지
## 사용 시나리오
### 시나리오 1: 실시간 채팅
```mermaid
graph LR
A[User1] -->|Subscribe| B[chat-room-1]
C[User2] -->|Subscribe| B
D[User3] -->|Publish| B
B -->|SSE| A
B -->|SSE| C
```
### 시나리오 2: 시스템 알림
```mermaid
graph LR
A[Admin] -->|Publish| B[system-alerts]
C[User1] -->|Subscribe| B
D[User2] -->|Subscribe| B
E[User3] -->|Subscribe| B
B -->|Broadcast| C
B -->|Broadcast| D
B -->|Broadcast| E
```
## 실행 방법
### 1. 프로젝트 빌드
```bash
dotnet build
```
### 2. 서버 실행
```bash
dotnet run --project PushServiceNet
```
### 3. 테스트 클라이언트 접속
브라우저에서 `http://localhost:5000` 접속
### 4. 유닛 테스트 실행
```bash
dotnet test
```
## 테스트 시나리오
### 1. 선택적 메시지 전달
- User1은 topic-a 구독, User2는 topic-b 구독
- topic-a로 메시지 발행 시 User1만 수신
### 2. 메시지 히스토리
- 오프라인 상태에서 발생한 메시지를 최대 100개까지 조회 가능
### 3. 다중 사용자 브로드캐스트
- 동일 토픽을 구독한 모든 사용자가 메시지 수신
## 성능 고려사항
- **액터 모델**: 동시성 처리 및 상태 격리
- **메시지 히스토리 제한**: 메모리 사용량 관리 (100개)
- **SSE 폴링 주기**: 1초 (조정 가능)
- **하트비트**: 연결 상태 모니터링
## 확장 가능성
1. **영구 저장소**: 메시지 히스토리를 데이터베이스에 저장
2. **클러스터링**: Akka.Cluster를 활용한 분산 처리
3. **인증/인가**: JWT 토큰 기반 보안
4. **메시지 필터링**: 사용자별 맞춤 필터
5. **우선순위 큐**: 중요도에 따른 메시지 처리
## 라이선스
이 프로젝트는 MIT 라이선스 하에 배포됩니다. |
이 실험에의해 완성된 최종코드(프롬프트 포함)
- https://github.com/psmon/PushServiceNet
- https://lilys.ai/digest/4975382/4306684?s=1¬eVersionId=585967
- 이 문서를 다시 재해석한 버전
동일한 컨셉을 타진영 언어로도 시도
NEXT : SSE 푸시시스템 자율주행으로 만들기 by 코프링
마치며
이 실험을 통해 얻은것은 CQRS패턴과 같은 액터모델도 생성형 프로그래밍이 가능하다란점과 도메인 로직이 그렇게 복잡하지않고
단방향 푸싱 시스템이긴하나 실수없이 한방에 완성한점은 다소 놀라움~삽질하는거 놀라움~삽질하는거 고쳐주느라 바이브 많이 할줄예상했으나 의존오류말고는 중간에 개입한게 거의 없이 완성되었으며 cluade-code를 조금더 연마해 어려운것을 시키는 변종실험 예정입니다.
상위컨텐츠 : Vibe Coding Actor Model
...

