お世話になります。PHPとMySQLで、オリジナルの「いいねボタン」の実装を進めているのですが、ある方から以下のような指摘を頂戴し、皆様の意見を伺えればと、質問させて頂きました。
会員登録制のサイトで、会員のみが押せるボタンであれば良いが、非会員でも押せる場合、悪意あるユーザがツールを使った場合、秒間1000回とかおされるとDBかサーバーが落ちてしまう。なので非会員でも押せるようにしたいのであれば、DBではなくファイルで管理するようにした方が数倍も負荷が抑えられる。
というものでした。
データは、1いいね毎に行数が増えるものではなく、数値を書き換えるもの(押されたとき「4」いいねだったら、「5」に書き換えるもの)ですが、この程度のデータ管理であればやはりファイルで行った方が宜しいのでしょうか?
また、今回の件含め、ファイルでデータを監視瑠つ際のメリット・デメリットもアドバイス頂けると助かります。
DBが便利なので、つい使いたがる節があるもので・・・
お忙しい中恐縮ですがアドバイスのほど、よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
データは、1いいね毎に行数が増えるものではなく、数値を書き換えるもの
基本的にはこの機能はだめです
イナズマイレブン人気投票五条事件や同ポケモンコイル事件など
不特定の人間がボタンを押したことでインクリメントされる仕組みは
評価を歪めさせることになります。
DBにユーザーIDと文書IDがユニークになるようにいいね情報を
集積してください、それをやらないといいねの取り消しや悪いね、または
5段階評価などデータが集計できなくなります
投稿2017/07/13 04:59
総合スコア114814
0
問題箇所が以下なのであれば、DBだとかファイルだとかあまり関係ないです。
会員登録制のサイトで、会員のみが押せるボタンであれば良いが、非会員でも押せる場合、悪意あるユーザがツールを使った場合、秒間1000回とかおされるとDBかサーバーが落ちてしまう。
ここを対策すべきかと。
機械的に押させるのを回避するんであれば、セッション情報に開始時間を記述し、1秒以上経っていなかったら投稿させないとか。
投稿2017/07/13 03:01
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/13 05:22
退会済みユーザー
2017/07/13 06:01
2017/07/13 06:08
0
phpでDDoS対策、総当り対策、連続アクセス制限 - Qiita
同一IPによる連続アクションを一定時間ブロックする - Qiita
上記の記事は考え方の参考になるので読んでおくべきです。
投稿2017/07/13 04:07
編集2017/07/13 06:10退会済みユーザー
総合スコア0
0
ベストアンサー
悪意あるユーザがツールを使った場合、秒間1000回とかおされるとDBかサーバーが落ちてしまう。
⇒接続できなくなるユーザや処理待ちのユーザは出てくるかもしれませんが、
基本的には落ちないと思われます。
この程度の悪意ツールであれば、仮に落ちても再起動で済むかな、と。
なお、秒間1000回に対する対策も色々ありますが、
PHP内や.htaccess(webconfig)、サーバーのアクセス制限等で対策するのが良いかと思います。
セッション情報やJavaScriptでの対策でも良いですが、
セッション情報もJavaScriptも編集できてしまうので、
悪意あるユーザとのいたちごっこになります。
DBではなくファイルで管理するようにした方が数倍も負荷が抑えられる。
⇒この指摘はお門違いです。
まぁ、最大限譲歩すると、
「ファイル管理であれば、ファイルを開いている間は誰も編集ができないから、
連続クリックはできないだろう」
という考え(間違ってます)なのかもしれません。
おそらく「ある方」というのは、質問者さんの目上の方と推測するので、
やんわり伝えなければならないのかもしれませんが、
「ファイル管理の場合、ファイルを開いている間は誰も編集ができなくなるので、
悪意のあるユーザがファイルをロックしている間、
悪意のないユーザがファイルを編集できなくなり、
いいねの回数の正確さが欠けます。
また、会員の場合、1つのコンテンツに対して、1会員あたり1いいねまでの場合、
ファイル管理だと管理が難しいですが、
DBで管理することで、制御する事が出来ます。
また、DB管理であれば、
悪意あるユーザのIP等も一緒に登録する事で、
2回以上のクリックを防いだり、あとでカウントを削除する事ができます。
また、悪意あるユーザが登録中に、
悪意のないユーザが登録しようとしても、
待機状態になるだけなので、悪意あるユーザのロックが解除された段階で
いいねがカウントされるので、やはりDB管理の方が良いです。」
と、これくらい丁寧に言わなきゃいけないかもしれませんね。
「ある方」はDBに対して信頼がない(知識がない)ようなので、
「DBの中身を閲覧・編集するには・・・」とその辺の知識も伝える必要があるかもしれませんね。
1いいね毎に行数が増えるものではなく、数値を書き換えるもの(押されたとき「4」いいねだったら、「5」に書き換えるもの)ですが、この程度のデータ管理であればやはりファイルで行った方が宜しいのでしょうか?
⇒その場合でも上記の同時処理の問題上、DBの方が良いと考えます。
まぁ、悪意あるユーザの件数を計上したままにするのであれば、
いいねの件数自体に、そんなに意味はないようなので、ファイル管理でも良いかもしれませんが。
なお、「悪意あるユーザ」の議論が出てきてしまっているので、
1いいね毎に行数が増える設計の方が良いかもしれません。
あと、管理の仕方的には、いいねの数を操作したいようにも受け取れましたが、
その場合もDB管理で実際のいいねの数と操作の数の2項目を持てば良いのでは、と思ってます。
ファイルでデータを監視する際のメリット・デメリット
○メリット
・MySQLが落ちた時、再起動中に閲覧ができる。(ほぼメリットとしてとらえられない)
・管理者側の閲覧・編集がDBより楽(誰でもできる)。
○デメリット
・誰でも開く事が出来てしまう。(ファイル権限等で防ぐことはできますが)
・管理者側が簡単にファイルを開いてロックし、データ不整合やエラーが発生する。
・同時編集によるファイル破損の可能性がある。
・ある程度の件数・容量以上のデータを管理できない。(開くのにも時間がかかる)
○テキストファイルで管理する用途
・Readmeテキストファイル
・開発中のデバックログ等(DBの方が良い場合もあります)
・環境設定データ群(他の方法で管理する方が良い場合もあります)
etc...
○テキストファイル管理が適さない用途
・リレーションが発生するもの全て
・編集が頻繁に行われるもの
・データ・容量が大きいもの
etc...
DBが便利なので、つい使いたがる節がある
⇒まったく問題ないです。
投稿2017/07/14 03:39
編集2017/07/14 03:41総合スコア760
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/14 11:02
退会済みユーザー
2017/07/14 11:42
2017/07/14 13:08
0
DBではなくファイルで管理するようにした方が数倍も負荷が抑えられる。
が、理解できないのですが、負荷が問題ならNoSQLデータベースは検討しましたでしょうか。
FacebookのApache Cassandraやニコニコ動画のRedisが有名です。
どちらも基本的にデータをインメモリで操作するため非常に高速です。
あと、インメモリという点ではMySQLでもMEMORYストレージエンジンがあります。(MEMORYは使ってみてクセが強くて難しいと個人的には感じました…)
投稿2017/07/13 09:41
総合スコア372
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/14 10:58
2017/07/18 00:12
2017/07/18 01:25
0
その指摘は少々ずれた感じがします
DBに対する負荷の問題は、いいねボタンのような機能に限りません
また、同一ユーザもしくは同一クライアントから大量にいいねボタンを押せるような状態は、機能的な問題があると思います
ご質問中に見えている課題は2点
・ユーザアクセスによる負荷対応をどうすべきか
・同一ユーザもしくは同一クライアントからのいいねボタン連打対応をどうすべきか
というわけで、DBの種類がファイルかRDBかは問題では無いと思います
DBではなくファイルで管理するようにした方が数倍も負荷が抑えられる
とおっしゃることの技術的な理由を解説してもらっていますか?
どのような意図があって「ファイルがよい」とのことなのか、再度確認してみてください
投稿2017/07/13 04:28
総合スコア3111
0
ファイルで管理することで回避できる問題でしょうか?
そもそも1秒間に100万回押されたら?とかイタチごっこでダメだと思います。
処理的にもファイルロックして、開いて、読み込んでインクリメントして、書いて、保存?
無駄な気しかしませんが。。。。
ストレージの媒体が分かれることで、同期をとってバックアップする必要もあります。
DBでトランザクション無しのインクリメント処理でいいんじゃないかと。
悪意のあるユーザってそんなに暇じゃないと思いますが。
それに普通いいねって1人は1000回押せたらダメなんじゃないですか?
ファイルに回数だけ保存するとできませんよね。機能的な問題を抱えているような気がします。
投稿2017/07/13 04:05
総合スコア1400
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/13 05:37