在Elixir和Phoenix项目中提供实时RSS更新,核心思路是结合Phoenix Channels做消息推送,并在服务端动态生成RSS内容。当有新文章发布时,系统通过PubSub广播事件,连接的客户端立即收到通知并拉取最新RSS。

整体架构
我们需要三部分:RSS控制器用来响应HTTP请求返回XML;一个GenServer模块缓存RSS数据;以及一个Channel用来推送更新消息。
RSS缓存模块
使用GenServer保存最新的RSS二进制内容,避免每次请求都查数据库。
defmodule MyApp.RssCache do
use GenServer
def start_link(_) do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def init(_) do
# 启动时生成一次RSS
{:ok, generate_rss()}
end
def get_rss do
GenServer.call(__MODULE__, :get)
end
def refresh do
GenServer.cast(__MODULE__, :refresh)
end
def handle_call(:get, _from, state) do
{:reply, state, state}
end
def handle_cast(:refresh, _state) do
{:noreply, generate_rss()}
end
defp generate_rss do
# 这里简化为写死的XML,实际应从数据库读取
"<?xml version="1.0"?><rss><channel><title>Demo</title></channel></rss>"
end
end
RSS控制器
在router里加一条路由,控制器直接返回缓存内容,并设置正确的Content-Type。
defmodule MyAppWeb.RssController do
use MyAppWeb, :controller
def index(conn, _params) do
xml = MyApp.RssCache.get_rss()
conn
|> put_resp_content_type("application/rss+xml")
|> send_resp(200, xml)
end
end
实时推送更新
当文章创建后,调用RssCache.refresh并广播消息。Channel里的客户端收到后重新请求RSS地址即可。
广播事件
defmodule MyApp.ArticleCreated do
def notify do
MyApp.RssCache.refresh()
MyAppWeb.Endpoint.broadcast("rss:feed", "updated", %{})
end
end
前端Channel接收
浏览器端使用Phoenix JS SDK订阅主题,收到updated事件后刷新列表。
let socket = new Phoenix.Socket("/socket")
socket.connect()
let channel = socket.channel("rss:feed", {})
channel.join()
channel.on("updated", () => {
fetch("/rss.xml").then(r => r.text()).then(xml => {
console.log("收到新RSS", xml)
})
})
小结
通过GenServer缓存、Controller输出XML、Channel广播,Elixir和Phoenix就能以很低成本提供实时RSS更新。后续可加上鉴权或按用户推送不同源。
ElixirPhoenixreal_time_RSS修改时间:2026-07-31 05:54:10