Skip to content
isdnetworks
Go back

μ•Œλ¦Όμ„ μ€„μ˜€λ”λ‹ˆ λ‹€μŒ 건이 λ¬»ν˜”λ‹€

(μˆ˜μ •λ¨)

cron 배치 μ‹€νŒ¨ μ•Œλ¦Όμ΄ ν•˜λ£¨μ— μˆ˜μ‹­ 톡씩 였고 λ‚΄μš©μ΄ λ‹€ κ°™μ•„μ„œ 아무도 보지 μ•Šμ•˜λ‹€. κ·Έλž˜μ„œ ν•œ μ‹œκ°„μ— ν•œ ν†΅λ§Œ λ‚˜κ°€κ²Œ λ°”κΏ¨λ‹€. κ·Έ λ’€λ‘œ μ‹€νŒ¨λ₯Ό λ©°μΉ  늦게 μ•Œκ²Œ 됐닀.

Table of contents

Open Table of contents

원인 β€” μ–΅μ œ 쑰건이 λ„ˆλ¬΄ λ„“μ—ˆλ‹€

μ΄λ ‡κ²Œ λ§Œλ“€μ—ˆλ‹€.

$last = $this->cache->get('last_alert_time');

if ($last && (time() - $last) < 3600) {
    return;   // ν•œ μ‹œκ°„ μ•ˆμ— 보낸 적 있으면 μ•ˆ 보냄
}

sendAlert($message);
$this->cache->save('last_alert_time', time(), 7200);

λ§ˆμ§€λ§‰μœΌλ‘œ 보낸 μ‹œκ°μ„ memcached ν‚€ ν•˜λ‚˜μ— λ‹΄κ³  TTL 을 ν•œ μ‹œκ°„μœΌλ‘œ 쀬닀. κ·Έ ν‚€κ°€ ν•˜λ‚˜λΌμ„œ μ’…λ₯˜λ₯Ό 가리지 μ•Šμ•˜κ³  μ–΄λ–€ μ•Œλ¦Όμ΄λ“  ν•œ μ‹œκ°„μ— ν•œ 톡이 됐닀.

μƒν’ˆ 동기화 μ‹€νŒ¨λ‘œ ν•œ 톡이 λ‚˜κ°€λ©΄ κ·Έ λ’€ ν•œ μ‹œκ°„ λ™μ•ˆ 결제 배치 μ‹€νŒ¨κ°€ λ¬»νžŒλ‹€. 같은 μ•Œλ¦Όμ„ μ€„μ΄λ €λ˜ 것인데 λ‹€λ₯Έ μ•Œλ¦ΌκΉŒμ§€ 쀄인 것이닀. μ€„μ΄λŠ” λŒ€μƒμ„ μ •ν•˜μ§€ μ•Šμ€ 것이 μ›μΈμ΄μ—ˆλ‹€.

μ–΅μ œ λ‹¨μœ„λ₯Ό λ‚˜λˆ΄λ‹€

ν‚€ 이름에 μ•Œλ¦Ό μ’…λ₯˜λ₯Ό λ„£μ—ˆλ‹€.

$key = 'last_alert:' . $type;   // 'last_alert:sync', 'last_alert:payment'

$last = $this->cache->get($key);
if ($last && (time() - $last) < 3600) {
    return;
}

sendAlert($message);
$this->cache->save($key, time(), 7200);

$type 이 킀에 λ“€μ–΄κ°€λ‹ˆ 같은 μ’…λ₯˜λ§Œ κ·Έ TTL μ•ˆμ—μ„œ μ–΅μ œλ˜κ³  λ‹€λ₯Έ μ’…λ₯˜λŠ” κ·ΈλŒ€λ‘œ λ‚˜κ°„λ‹€. λŒ€μƒ λ²ˆν˜ΈκΉŒμ§€ λ„£μœΌλ©΄ 더 쒁게 λ‚˜λˆŒ μˆ˜λ„ μžˆμ—ˆλ‹€.

$key = 'last_alert:' . $type . ':' . $targetId;

λ‹€λ§Œ λ„ˆλ¬΄ 쒁히면 μ–΅μ œλ₯Ό μ•ˆ ν•˜λŠ” 것과 κ²°κ³Όκ°€ κ°™μ•„μ§„λ‹€. 같은 λŒ€μƒμ—μ„œ 계속 λ‚˜λŠ” μ‹€νŒ¨λŠ” λ‹€μ‹œ μˆ˜μ‹­ 톡이 λœλ‹€. μ–΄λŠ λ‹¨μœ„λ‘œ λ‚˜λˆŒμ§€κ°€ 이 μž‘μ—…μ˜ νŒλ‹¨μ΄μ—ˆλ‹€.

μ–΅μ œλœ 건수λ₯Ό ν•¨κ»˜ λ³΄λƒˆλ‹€

μ–΅μ œν•˜λ©΄ κ·Έ 사이에 λͺ‡ 번 μžˆμ—ˆλŠ”μ§€ μ•Œ 수 μ—†λ‹€. κ·Έλž˜μ„œ μ•ˆ 보낸 횟수λ₯Ό μ„Έμ–΄ 두고 λ‹€μŒ μ•Œλ¦Όμ— λΆ™μ˜€λ‹€.

$cnt = (int)$this->cache->get($key . ':count');

if ($last && (time() - $last) < 3600) {
    $this->cache->save($key . ':count', $cnt + 1, 7200);
    return;
}

$extra = $cnt > 0 ? " (μ§€λ‚œ 1μ‹œκ°„ λ™μ•ˆ {$cnt}건 더 λ°œμƒ)" : '';
sendAlert($message . $extra);
$this->cache->save($key . ':count', 0, 7200);

λ°›λŠ” μ•Œλ¦Όμ€ μ΄λ ‡κ²Œ λœλ‹€.

[λ°°μΉ˜μ‹€νŒ¨] μƒν’ˆ 동기화 μ‹€νŒ¨ (μ§€λ‚œ 1μ‹œκ°„ λ™μ•ˆ 47건 더 λ°œμƒ)

μ—¬κΈ°μ„œ ν•œ 번 κ±Έλ Έλ‹€. Memcached::increment() 에 μ΄ˆκΈ°κ°’μ„ μ£Όλ €λ©΄ OPT_BINARY_PROTOCOL 이 켜져 μžˆμ–΄μ•Ό ν•˜κ³  μ•„λ‹ˆλ©΄ 인자 였λ₯˜κ°€ λ‚œλ‹€. κ·Έλž˜μ„œ add() 둜 λ¨Όμ € λ§Œλ“€κ³  increment() λ₯Ό λΆ€λ₯΄λŠ” μͺ½μœΌλ‘œ ν–ˆλ‹€.

ν•œ 건 μ‹€νŒ¨ν•œ 것과 μˆ˜μ‹­ 건 μ‹€νŒ¨ν•œ 것은 λ‹€λ₯Έ 상황이닀. μˆ«μžκ°€ μ—†μœΌλ©΄ λ‘˜μ΄ 같은 μ•Œλ¦ΌμœΌλ‘œ 보인닀. 이 ν•œ 쀄이 λŒ€μ‘ μˆœμ„œλ₯Ό λ°”κΏ¨λ‹€.

비ꡐ β€” μ–΅μ œν•˜μ§€ μ•ŠλŠ” μ•Œλ¦Ό

μ•Œλ¦Ό μ’…λ₯˜λ₯Ό λ‚˜λˆ  λ³΄λ‹ˆ μ–΅μ œν•΄λ„ λ˜λŠ” 것과 μ•„λ‹Œ 것이 κ°ˆλ Έλ‹€.

μ’…λ₯˜μ–΅μ œ
배치 μ‹€νŒ¨1μ‹œκ°„
쑰회 μ§€μ—°1μ‹œκ°„
결제 처리 μ‹€νŒ¨μ•ˆ 함
λ°μ΄ν„°λ² μ΄μŠ€ 접속 μ‹€νŒ¨μ•ˆ 함

돈이 κ±Έλ¦° 것과 전체가 λ©ˆμΆ”λŠ” 것은 memcached λ₯Ό μ•„μ˜ˆ μ•ˆ 보고 맀번 λ³΄λ‚΄κ²Œ λ’€λ‹€. μ‹œλ„λŸ¬μ›Œλ„ 그게 λ§žμ•˜λ‹€. μ–΅μ œλŠ” μ—¬λŸ¬ 번 와도 λŒ€μ‘μ΄ 같은 κ²ƒμ—λ§Œ κ±Έμ—ˆλ‹€.

볡ꡬ됐을 λ•Œλ„ μ•Œλ¦¬κ²Œ ν–ˆλ‹€.

if ($nowOk && $this->cache->get('failing:' . $type)) {
    sendAlert("[볡ꡬ] {$type} 정상화");
    $this->cache->delete('failing:' . $type);
}

볡ꡬ μ•Œλ¦Όμ΄ 있으면 μ‹€νŒ¨ μ•Œλ¦Όμ„ 받고도 κΈ°λ‹€λ € λ³Ό 수 μžˆλ‹€. μ—†μœΌλ©΄ 맀번 λ“€μ–΄κ°€μ„œ 봐야 ν•œλ‹€.

μ•Œλ¦Όμ„ λ³΄λ‚΄λŠ” μ½”λ“œ μžμ²΄κ°€ 죽으면 아무 μ•Œλ¦Όμ΄ μ—†κ³  그러면 μ •μƒμœΌλ‘œ 보인닀. κ·Έλž˜μ„œ cron 으둜 ν•˜λ£¨ ν•œ 번 정상 μ‹ ν˜Έλ₯Ό λ³΄λ‚΄κ²Œ ν–ˆλ‹€.

[일일점검] 배치 5μ’… 정상, μ–΄μ œ μ‹€νŒ¨ 3건

이게 μ•ˆ 였면 κ°μ‹œ μžμ²΄κ°€ 멈좘 것이닀. 아무 μ†Œμ‹μ΄ μ—†λŠ” 것을 μ •μƒμœΌλ‘œ 읽으면 μ•ˆ 되고 정상일 λ•Œλ„ μ†Œμ‹μ΄ μžˆμ–΄μ•Ό λ‘˜μ΄ κ΅¬λΆ„λœλ‹€.

μˆ˜μ‹ μžλ„ μ„€μ • νŒŒμΌμ— λͺ©λ‘μœΌλ‘œ λ’€λ‹€. ν•œ μ‚¬λžŒ λ©”μΌλ‘œλ§Œ κ°€λ©΄ κ·Έ μ‚¬λžŒμ΄ νœ΄κ°€μΌ λ•Œ 아무도 λͺ» 보고 μ½”λ“œμ— λ°•μ•„ 두면 μ‚¬λžŒμ΄ λ°”λ€” λ•Œλ§ˆλ‹€ λ°°ν¬ν•œλ‹€.

정리


Share this post on:

Previous Post
λͺ°μ•„ 보내면 λ§‰νžŒλ‹€
Next Post
ν•œ κ³³μ—μ„œλ§Œ κΉ¨μ§€λ˜ κΈ€μž