Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Docs/Guides
    • akka.net 이용하는경우
    • 코틀린에서 akka오픈(pekko) 이용하는경우
    • 시도하고싶은 오픈소스 샘플코드가 있다고하면 유사한 형태로 하위에 그냥 때려박으면 되겠습니다.
      • 과거에는 오픈소스를 해석하고 실험하고 했다고하면 여기서의 컨셉은~ 좋은 코드컨셉이 있다고 느낌이오면 샘플코드를 넣어 고급패턴을 바로 이용하는 전략입니다.


이 실험에 이용된 생성지침과 실제 지식파일입니다.

View file
nameGuides.zip
height150




Info

cluade 코드를 실행한후

> "생성지침.md" 수행해줘   

팁 : alt+tab을 눌러 plan mode로 전환한후 수행합니다. 안해줘도 plan mode라 판단되면 수행하는듯하나 명시적 수행모드로

...

  • 테스트 클라이언트 옵션 꼼꼼히 잘 만들어준듯
  • 유닛테스트 작성시 버전못맞춘거  말고 여기까지 잘수행됨


문서화만들기

문서화도 귀찮으니~ 잘작동하고 돌아가면 문서화까지 요청

Code Block
지금까지 너가 생성한 코드(프로젝트,유닛테스트) 를 다시 분석해 help.md 문서로 이 프로젝트의 컨셉및 문서를 만들어죠 다이어그램이 필요하면 mermaid로 로 설명 
  • AI는 자기가 생성했다란 사실을 인지할까?

Image Added

  • 문서 작성능력도 합격~ 실제 작성된 md파일
Code Block
themeEmacs
# 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 라이선스 하에 배포됩니다.