<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>校园即时聊天系统 on 世界</title>
    <link>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/</link>
    <description>Recent content in 校园即时聊天系统 on 世界</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <atom:link href="https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>1. 配置读取</title>
      <link>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/1_%E9%85%8D%E7%BD%AE%E8%AF%BB%E5%8F%96/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/1_%E9%85%8D%E7%BD%AE%E8%AF%BB%E5%8F%96/</guid>
      <description>&lt;h2 id=&#34;配置读取&#34;&gt;配置读取&lt;a class=&#34;anchor&#34; href=&#34;#%e9%85%8d%e7%bd%ae%e8%af%bb%e5%8f%96&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;使用&lt;code&gt;https://github.com/BurntSushi/toml.git&lt;/code&gt;作为toml配置文件的解析库&lt;/p&gt;&#xA;&lt;p&gt;我们只需要Config.LoadConfig()函数来读取配置文件，其他部分不需要关心。&lt;/p&gt;</description>
    </item>
    <item>
      <title>2. 日志系统</title>
      <link>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/2_%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/2_%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F/</guid>
      <description>&lt;h2 id=&#34;日志库&#34;&gt;日志库&lt;a class=&#34;anchor&#34; href=&#34;#%e6%97%a5%e5%bf%97%e5%ba%93&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;校园即时聊天系统需要一个日志库来记录系统运行时的各种信息，包括错误日志，访问日志，调试日志等。一个好的日志库能够帮助我们快速定位问题，分析系统行为，以及监控系统状态。&lt;/p&gt;</description>
    </item>
    <item>
      <title>3. Redis缓存</title>
      <link>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/3_redis%E7%BC%93%E5%AD%98/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/3_redis%E7%BC%93%E5%AD%98/</guid>
      <description>&lt;h2 id=&#34;redis在校园即时聊天系统中的应用&#34;&gt;Redis在校园即时聊天系统中的应用&lt;a class=&#34;anchor&#34; href=&#34;#redis%e5%9c%a8%e6%a0%a1%e5%9b%ad%e5%8d%b3%e6%97%b6%e8%81%8a%e5%a4%a9%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e5%ba%94%e7%94%a8&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Redis 是一种以内存为核心的数据库系统，因此具备很强的读写能力。由于数据直接保存在内存中，它可以在单位时间内完成大量读写请求，这使其非常适合高并发、低时延的业务场景。把 Redis 作为后端数据的存储与缓存媒介，能够有效提高系统处理请求的效率，并改善整体性能表现。&lt;/p&gt;</description>
    </item>
    <item>
      <title>4. 消息发送逻辑</title>
      <link>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/4_%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E9%80%BB%E8%BE%91/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/4_%E6%B6%88%E6%81%AF%E5%8F%91%E9%80%81%E9%80%BB%E8%BE%91/</guid>
      <description>&lt;p&gt;我的理解是为了保证消息的顺序性和防止老消息饿死&lt;/p&gt;&#xA;&lt;p&gt;这段代码的设计意图，本质上是两个字：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;补发&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;它把消息队列分成两层：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ChatServer.Transmit&lt;/code&gt;：全局主队列，服务端真正消费这个队列&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;c.SendTo&lt;/code&gt;：当前客户端自己的“积压队列”&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;为什么要先用 &lt;code&gt;for&lt;/code&gt; 把 &lt;code&gt;SendTo&lt;/code&gt; 里的旧消息往 &lt;code&gt;Transmit&lt;/code&gt; 搬，再处理这次新消息？因为作者想保证：&lt;/p&gt;</description>
    </item>
    <item>
      <title>5. Server逻辑</title>
      <link>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/5_server%E9%80%BB%E8%BE%91/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://muzimi.org/docs/%E6%A0%A1%E5%9B%AD%E5%8D%B3%E6%97%B6%E8%81%8A%E5%A4%A9%E7%B3%BB%E7%BB%9F/5_server%E9%80%BB%E8%BE%91/</guid>
      <description>&lt;p&gt;这里的 &lt;strong&gt;server 逻辑&lt;/strong&gt;，核心就是一句话：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;维护在线连接，消费待转发消息，再把消息分发给目标客户端。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;核心文件是 &lt;code&gt;internal/service/chat/server.go:25&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-server-里有什么&#34;&gt;1. Server 里有什么&lt;a class=&#34;anchor&#34; href=&#34;#1-server-%e9%87%8c%e6%9c%89%e4%bb%80%e4%b9%88&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;Server&lt;/code&gt; 结构体有 4 个关键成员：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Clients map[string]*Client&lt;/code&gt;&#xA;按用户 &lt;code&gt;uuid&lt;/code&gt; 维护在线连接表。谁在线，就能从这里找到谁。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Transmit chan []byte&lt;/code&gt;&#xA;全局消息转发队列。所有客户端发上来的消息，最后都会进这里，等待服务端处理。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Login chan *Client&lt;/code&gt;&#xA;登录队列。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Logout chan *Client&lt;/code&gt;&#xA;登出队列。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;定义位置在 &lt;code&gt;internal/service/chat/server.go:25&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
